Android Studio'nun 1.0'a güncellenmesiyle NDK araç zinciri desteği son derece gelişti ( not: yeni deneysel Gradle eklentisi ve Android Studio 1.5 ile kullanımı görmek için lütfen bu yazının altındaki güncellemelerimi okuyun ).
Android Studio ve NDK, modülünüzün build.gradle dosyasında bir ndk {} bloğu oluşturmanız ve kaynak dosyalarınızı (module) / src / main / jni dizinine ayarlamanız için yeterince iyi bir şekilde entegre edilmiştir. bitmiş!
Komut satırından artık ndk-build yok.
Bununla ilgili her şeyi blog gönderime yazdım: http://www.sureshjoshi.com/mobile/android-ndk-in-android-studio-with-swig/
Dikkat çeken noktalar:
Burada bilmeniz gereken iki şey var. Varsayılan olarak, Android uygulamasına yüklenmesini istediğiniz harici kütüphaneleriniz varsa, bunlar varsayılan olarak (module) / src / main / jniLibs içinde aranır. Modülünüzün build.gradle içindeki sourceSets.main.jniLibs.srcDirs ayarını kullanarak bunu değiştirebilirsiniz. Hedeflediğiniz her mimari için kitaplık içeren bir alt dizine ihtiyacınız olacaktır (örn. X86, kol, mips, arm64-v8a vb.)
NDK araç zinciri tarafından varsayılan olarak derlenmesini istediğiniz kod, (module) / src / main / jni dizininde bulunur ve yukarıdakine benzer şekilde, modülünüzün build.gradle içindeki sourceSets.main.jni.srcDirs öğesini ayarlayarak değiştirebilirsiniz.
ve bunu modülünüzün build.gradle dosyasına koyun:
ndk {
moduleName "SeePlusPlus" // Name of C++ module (i.e. libSeePlusPlus)
cFlags "-std=c++11 -fexceptions" // Add provisions to allow C++11 functionality
stl "gnustl_shared" // Which STL library to use: gnustl or stlport
}
Bu, C ++ kodunuzu derleme işlemidir, oradan yüklemeniz ve paketleyicileri oluşturmanız gerekir - ancak sorunuzdan yola çıkarak, tüm bunları nasıl yapacağınızı zaten biliyorsunuz, bu yüzden yeniden hash etmeyeceğim.
Ayrıca, bu örneğin bir Github kopyasını buraya yerleştirdim: http://github.com/sureshjoshi/android-ndk-swig-example
GÜNCELLEME: 14 Haziran 2015
Android Studio 1.3 çıktığında, JetBrains CLion eklentisi aracılığıyla C ++ için daha iyi destek olmalıdır. Şu anda Android Studio içinden Java ve C ++ geliştirmeye izin vereceği varsayımı altındayım; ancak Gradle NDK bölümünü yukarıda belirttiğim gibi kullanmamız gerektiğini düşünüyorum. Ayrıca, CLion bunları otomatik olarak yapmayacaksa, Java <-> C ++ sarmalayıcı dosyaları yazmaya hala ihtiyaç olacağını düşünüyorum.
GÜNCELLEME: 5 Ocak 2016
Blogumu ve Github Repo'yu (geliştirme dalında) en son deneysel Gradle eklentisi (0.6.0-alpha3) ile Android Studio 1.5'i kullanacak şekilde güncelledim.
http://www.sureshjoshi.com/mobile/android-ndk-in-android-studio-with-swig/
http://github.com/sureshjoshi/android-ndk-swig-example
NDK bölümü için Gradle derlemesi şu şekilde görünüyor:
android.ndk {
moduleName = "SeePlusPlus" // Name of C++ module (i.e. libSeePlusPlus)
cppFlags.add("-std=c++11") // Add provisions to allow C++11 functionality
cppFlags.add("-fexceptions")
stl = "gnustl_shared" // Which STL library to use: gnustl or stlport
}
Ayrıca, oldukça garip bir şekilde, Android Studio 'yerli' anahtar kelimeyi kullanarak C ++ - Java tarafından oluşturulan sarmalayıcıları için otomatik tamamlama özelliğine sahiptir:
Ancak, tamamen pembe değil ... Otomatik olarak kod oluşturmak için bir kitaplığı sarmak için SWIG kullanıyorsanız ve daha sonra yerel anahtar kelime otomatik oluşturmayı kullanmaya çalışırsanız, kodu Swig _wrap'nizde yanlış yere koyar .cxx dosyası ... Yani "extern C" bloğuna taşımanız gerekir:
GÜNCELLEME: 15 Ekim 2017
Android Studio 2.2'den sonra Gradle ve CMake aracılığıyla NDK araç zinciri için esasen 'yerli' (pun yok) desteğe sahip olduğundan bahsetmezsem hatırlayacağım. Şimdi, yeni bir proje oluşturduğunuzda, C ++ desteğini seçmeniz yeterlidir.
Yine de kendi JNI katman kodunuzu oluşturmanız veya yukarıda bahsettiğim SWIG tekniğini kullanmanız gerekecek, ancak Android projesinde bir C ++ iskelesi artık önemsiz.
CMakeLists dosyasındaki değişiklikler (C ++ kaynak dosyalarınızı yerleştirdiğiniz yer) Android Studio tarafından alınır ve ilişkili kitaplıkları otomatik olarak yeniden derler.