C++ Qt projesinde Java kodunu nasıl kullanabilirim?

Merhabalar, C++ Qt projesinde Java kodunu nasıl kullanıyoruz  derken sizinde tüyleriniz diken diken oldu mu ?

Bloğumdaki ilk gönderimde bu konuyu seçmemin nedeni;

Kendimi blog yazmaya heveslendirmek için programcılıkta en çok sevdiğim yöntem olan tek bir projeden diğer platformlara has özelliklerin kullanılabilmesini sizinle paylaşmak istiyorum.

Bu işe neden ihtiyaç duyuyoruz ona da değinecek olursak, C++ Qt Framework u üzerinden Android ve ya iOS platformuna ait spesifik özelliklerini kullanabilmesi imkansızdır (Ağ durumu, Rehber, Pil seviyesi, şarj durumu vs.).

Bu yüzdendir ki, 2 platformada aynı hizmeti vermeyi hedefleyen oluşturacağımız temel bir interface ile platformun native (java,obj-c,swift) programlama dili ile oluşturulmuş bir methodu çağırabiliyor veya platform methodundan c++ tarafındaki methodu tetikletebiliyor olmamız gerekiyor.

Java kısmından bahsedecek olursak, Android platformuna ait özellikleri kullanmak üzere onlara erişmek için JNI (Java Native Interface) olarak adlandırılan bir shared object içindeki C/C++ fonksiyonlarının java içinde kullanılmasında köprü vazifesi gören bir teknolojiyi kullanacağız . Elbette JNI teknolojisi sadece C/C++ kodlarının çağrılmasından ibaret değildir. Bunun içine javanın içinde barındırmadığı çağrılar ve alt seviyeli diller (assembler gibi) yardımıyla javanın ulaşamadığı platforma bağlı bir çok native kodlar da girmektedir.

JNI, diğer dillerde yazılmış uygulamaların, native kısmından çağrılacak ve çağrılabilecek bir framework. Çoğunlukla, platforma özgü özelliklere erişme, yüksek performanslı modüller ve java binding i C/C++ ile yazmak için kullanılır

Java methodunu C++ Qt projesinde nasıl çağırabilirim?
Java methodunu C++ Qt projesinde nasıl çağırabilirim?

İhtiyac duyduğum qt projelerimde kullanmış olduğum JNI için C++ wrapper sınıfı sizinle paylaşayım.

Öncelikle, C++ wrapper sınıfımızı oluştururken RAII (Resource Acquisition Is Initialization) tekniğini kullanmak çok faydalı olacaktır. (Bir kaynak yaşam döngüsünü (tahsis edilen bellek, yürütme iş parçacığı, açık soket, açık dosya, kilitli mutex, veritabanı bağlantısı-sınırlı kaynağı olan her şeyi) bir nesnenin ömrüne bağlar.

Bjarne Stroustrup’s C++ Style and Technique FAQ

Bu iki avantaja sahiptir;

  • Tam olarak bir C++ nesnesi bir Java nesnesini temsil eder.
  • Oluşturulan referansları hafızadan serbest bırakmayı hatırlamak zorunda kalmayız.

JNI’daki referans türlerini incelemek isteyebilirsiniz

JniObject, sınıf ve nesne için global referansları tutacak,
C++ nesnesi yok edilinceye kadar garbage collector tarafından silinmeyecek. (RAII, kaynağın nesneye erişebilecek herhangi bir işlev için kullanılabileceğini garanti eder)

Not: Kendi sabırsızlığım yüzünden yazıyı istemiş gibi tamamlayamadım ama ben göndermek istiyorum. Saat 01:00 olmak üzere, sonrasında kaldığım yerden devam edeceğim.

jniobject.h

 

jniobject.cpp

 

 

JavaNatives.java