Bir grup kaynağı tek bir monolitik JNI kitaplığına bağlayan bir Android projem var. Bu tek kütüphaneyi, aralarındaki bazı bağımlılıkları olan çok sayıda küçük kütüphaneye ayırmak istiyorum. Bunu yeni platform inşa sistemi ile nasıl başarabilirim?Yapılandırma ve bağlantı noktası kullanarak çoklu NDK kitaplıklarını bağlama
cevap
Bunu, bağımsız bir Android yerel eklentisiyle experimental gradle plugin family'dan elde edebilirsiniz. Yeni eklentiler, gradle component approach towards modeling builds dayanmaktadır. many advantages to using the new system vardır. Örneğin
:
root
+ lib -> 'com.android.model.native'
+ lub -> 'com.android.model.native'
+ aar -> 'com.android.model.library'
+ app -> 'com.android.model.application'
build.gradle
configure([project(':lib'), project(':lub'), project(':aar'), project(':app')]) {
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle-experimental:0.6.0-alpha5'
}
}
}
lib/build.gradle
apply plugin: "com.android.model.native"
model {
android {
compileSdkVersion 23
ndk {
moduleName "foo"
}
sources {
main {
jni {
exportedHeaders {
srcDir "src/main/headers"
}
}
}
}
}
lub/build.gradle
apply plugin: "com.android.model.native"
model {
android {
compileSdkVersion 23
ndk {
moduleName "bar"
}
sources {
main {
jni {
exportedHeaders {
srcDir "include"
}
}
}
}
}
AAR/build.gradle
apply plugin: "com.android.model.library"
model {
android {
buildToolsVersion '23.0.2'
compileSdkVersion 23
ndk {
moduleName "aggregate-jni"
stl "stlport_shared" // using cpp?
}
sources {
main {
jni {
dependencies {
project ":lib"
project ":lub"
}
}
}
}
}
uygulama/build.gradle
apply plugin: 'com.android.model.application'
model {
android {
buildToolsVersion '23.0.2'
compileSdkVersion 23
defaultConfig {
applicationId "com.example.app"
minSdkVersion.apiLevel 21
targetSdkVersion.apiLevel 23
versionCode 1
versionName "1.0"
}
}
}
dependencies {
compile project(':aar')
}
bağlantı dinamik ise (NDK için varsayılan), AAR içerecektir :
libfoo.so libbar.so libaggregate-jni.so libstlport.so
ve ayna java sınıflarınız. Java sınıflarınızda ve başvurulan kitaplıklar da
belgelerini yükleyebilir. Bağlantı statik ise, yine de tek bir libaggregate-jni.so
ile sonuçlanacaksınız. end up with multiple copies of the stl in your binary'u kullanacağınız gibi, bir grup şeyi statik olarak stl'ye bağlamak kötü olduğunu unutmayın. Bu gerçekten şeyleri mahvedebilir.
Varsayılan gcc
toolchain is now deprecated olduğunu unutmayın. Kullanımı en iyisi:
model {
android {
ndk {
toolchain 'clang'
stl 'c++_shared'
}
}
}
Son olarak, kesinlikle bir AAR gerekmez, ben sadece bütünlüğü sağlamak için dahil. Uygulama eklentisi de ndk'yi tam olarak desteklediğinden, uygulama projesi doğrudan bağımsız yerel lib projelerine bağlı olabilir.
C'deki deneyimim sınırlıdır, bu nedenle bir çift bilgisizlik için özür dileriz: 1) 'lub' nedir? 2) Dışa aktarılan başlıklar alanı, yalnızca c başlık dosyalarının yeridir, özel bir şey değil mi? Daha önce LOCAL_C_INCLUDES ile beslenen şey aynı mıydı? – Anthony
@Anthony re # 2 evet. Bağlandığınız bileşenin genel API'sini oluşturan başlıkların konumu. Diğer sınıf projeleri, bağlı oldukları bileşenler için başlıkların nerede bulunacağını bilmelidir. – dcow
Birden çok bağımlılık başarıyla oluşturdunuz mu? 'bağımlılıkları { projesi": lib " projesi": lub " }' yalnızca ilk projeyi alır. Onları eksik bağımlılıklar değiştirirseniz değiştiririm, ancak her ikisini de eklemiyor gibi görünüyor. – Anthony
Merhaba, aynı endişeye sahibim, bunu başarmanın bir yolunu buldunuz mu? Saygılarımızla. –