(Gerçek) iyilik, yüzlerinizi doğu ve(ya) batı tarafına çevirmeniz değildir. Gerçek iyilik, kişinin Allah’a, ahiret gününe, meleklere, Kitaba ve peygamberlere inanmasıdır. (Allah’ın rızasını gözeterek) yakınlara, yetimlere, yoksullara, yolda kalmışa, (yardım) isteyenlere ve kölelere sevdiği maldan harcamasıdır. (Ayrıca) namazı kılması, zekâtı vermesidir. (Bunlar) antlaşma yaptığı zaman sözlerini yerine getirenlerdir. (Dahası), sıkıntı, hastalık ve savaş zamanlarında sabredenlerdir. Doğru olanlar işte bunlardır! [Muttakî]ler (duyarlı olanlar) da işte bunlardır!
Bakara 177
Giriş
Android projelerinde okunmasını istemediğiniz ya da daha fazla performans gereken alanlarda NDK'lara ihtiyaç duyarsınız. TUYA isimli firmanın sdk'sını incelediğim zamanlarda en kritik alanları NDK ile geliştirdiklerinden dolayı kodlarını istediğim gibi okuyamamıştım ki bu son derece önemli olan kısımdı. Şimdi bir projede NDK oluşturmayı daha sonra oluşturulan bu NDK'yı başka projelere nasıl dahil edebiliriz onu göreceğiz.
Hello World
Direkt olarak Android Studio üzerinden projenizi oluşturun daha sonrasına File >> New >> New Module >> Android Native Library kısmını seçin. Böylece projenizi oluşturmuş olacaksınız. İstediğiniz ismi verebilirsiniz. Oluşturma aşamasının sonunda aşağıdaki gibi dosya yapısı olmasını beklemekteyiz.

Şimdi oluşan modül içerisindeki CPP ve Kotlin kodlarına bakalım. CPP içerisinde ana kodlarımız varken, kotlin kodları ise bir arayüz görevi görecektir. Kotlin kodları aracılığı ile projemizde istediğimiz Native kodlara ulaşacağız.

Yukarıdaki kodlarda cpp kodlarını görmekteyiz aşağıda cpp ve kotlin kodlarını veriyorum. Bunlar modülü oluşturduğunuzda defult olarak gelen kodlar.
#include <jni.h>
#include <string>
extern "C" JNIEXPORT jstring JNICALL
Java_com_cyberwhiz_nativekutuphane_NativeLib_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
package com.cyberwhiz.nativekutuphane
class NativeLib {
/**
* A native method that is implemented by the 'nativekutuphane' native library,
* which is packaged with this application.
*/
external fun stringFromJNI(): String
companion object {
// Used to load the 'nativekutuphane' library on application startup.
init {
System.loadLibrary("nativekutuphane")
}
}
}
Şimdi gradle dosyasına istediğimiz bağımlılığı ekleyelim.
implementation project(path: ':nativeKutuphane')
Şimdi ise MainActivity altına asıl kodlarımızı yazalım.
package com.cyberwhiz.myapplication
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.cyberwhiz.nativekutuphane.NativeLib
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
println(NativeLib().stringFromJNI())
}
}
Programı çalıştırdığınızda çıktınız aşağıdaki gibi olacaktır.

Şimdi bu ndk'yı başka bir projede nasıl kullanabileceğimize bakalım.
Export
Aslında projemiz derlendiğinde .so ve .aar dosyalarımız oluştu. Bunları aşağıdaki resimde göstermeye çalıştım.

Burada aslında önemli olan .aar dosyamız ama .so dosyalarının nerede olduğunu merak ederseniz aşağıdaki örnek path'de bulabilirsiniz:
MyApplication4/nativeKutuphane/build/intermediates/cmake/debug/obj/arm64-v8a
Şimdi bu .aar dosyasına normal olarak gidelim ve bunu kopyalayalım aslında export alacağımız dosya bu olacaktı ve bizim için zaten hazırlandı.
Daha sonrasında yeni bir proje başlatın. Başlattığınız yeni projede libs klasörü altına bu .aar dosyasını kopyalayın. Son görüntü aşağıdaki resimde olduğu gibi olacaktır.

Şimdi gradle dosyamızı aşağıdaki satırı ekleyelim.
implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
Hepsi bu! Artık kullanmaya başlayabiliriz. MainActivity sınıfını aşaıdaki gibi değiştirdim.
package com.cyberwhiz.myapplication
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.cyberwhiz.nativekutuphane.NativeLib;
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val nativeLib = NativeLib()
val result = nativeLib.stringFromJNI()
println(result)
}
}
İşte çıktı:

İlk Yorumu Siz Yapın