Ho un progetto Android che collega insieme un gruppo di fonti in un'unica libreria JNI monolitica. Vorrei dividere questa singola libreria in più librerie più piccole con alcune dipendenze tra di loro. Come posso ottenere questo risultato con il nuovo sistema di sviluppo gradle?Costruisci e collega più librerie NDK utilizzando gradle
risposta
È possibile ottenere questo con il plug-in Android autonomo standalone dal experimental gradle plugin family. I nuovi plug-in si basano sullo gradle component approach towards modeling builds. Ci sono many advantages to using the new system.
Ad esempio:
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"
}
}
}
}
}
app/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')
}
Se il collegamento è dinamico (predefinito per NDK), l'aar conterrà :
libfoo.so libbar.so libaggregate-jni.so libstlport.so
e le tue classi di mirror java. È possibile semplicemente
System.load("aggregate-jni");
nelle classi java e le librerie di riferimento caricheranno anche. Se il collegamento è statico, finirai con un singolo libaggregate-jni.so
. Tieni presente che è scorretto collegare in modo statico un sacco di cose contro lo stl, come se fosse end up with multiple copies of the stl in your binary. Questo può davvero rovinare tutto.
Si noti che il valore predefinito è gcc
toolchain is now deprecated. E 'probabilmente meglio usare:
model {
android {
ndk {
toolchain 'clang'
stl 'c++_shared'
}
}
}
Infine, è assolutamente non hanno bisogno di un AAR, ho semplicemente incluso per completezza. Il progetto dell'app può dipendere direttamente da progetti libali nativi autonomi in quanto il plug-in dell'applicazione supporta completamente anche l'ndk.
La mia esperienza in c è limitata, quindi scusami un paio di domande ignoranti: 1) Cos'è "lub"? 2) Il campo delle intestazioni esportate è solo la posizione dei file di intestazione c, niente di speciale? La stessa cosa che avremmo passato a LOCAL_C_INCLUDES prima? – Anthony
@Anthony re # 2 sì. È l'ubicazione delle intestazioni che costituiscono l'API pubblica del componente a cui stai collegando. Altri progetti gradle devono sapere dove trovare le intestazioni dei componenti da cui dipendono. – dcow
Hai creato con successo più dipendenze? 'dipendenze { progetto": lib " progetto": lub " }' solo acquisisce il primo progetto. Se li scambio l'interruttore delle dipendenze mancante, ma non sembra aggiungere entrambi. – Anthony
- 1. NDK che compila più librerie
- 2. Costruisci librerie condivise in ATLAS
- 3. Costruisci libreria condivisa che collega ad altre libararie condivise non standard
- 4. Supporto NDK -multlib per Android con gradle
- 5. Come utilizzare librerie extra * .so su Android Studio e NDK
- 6. Costruisci librerie statiche Graphviz per iOS
- 7. Gradle Android, librerie native per diverse architetture
- 8. Costruisci APK non firmato con Gradle
- 9. GCC Non collega le librerie corrette
- 10. Costruisci le librerie OpenCV 2.0 dall'origine utilizzando Visual Studio 2010 Beta e CMake
- 11. Differenza tra librerie statiche e condivise in NDK di Android?
- 12. Android NDK - OpenGL ES Tutorial/Librerie
- 13. NDK non trova le librerie C++ standard
- 14. utilizzando mupdf ndk-build error
- 15. Miscelazione di plug-in android da gradle e gradle-experimental
- 16. Collega le versioni statiche delle librerie Boost usando CMake
- 17. collega un file utilizzando Proto qmake
- 18. Collegamento di librerie di terze parti (libs.a) con NDK
- 19. Costruisci e analizza usando xcodebuild
- 20. Gradle: modifica NDK build target indipendente dall'obiettivo di build SDK
- 21. Utilizzo di librerie predefinite e jni in Android Studio
- 22. Gradle e più progetti con dipendenza Roboguice
- 23. aggiungi .idea/librerie a .gitignore con Android Studio (e Gradle) una buona idea?
- 24. Android NDK e FFMPEG build
- 25. Android Studio: New Gradle accumulo NDK errore di esempio app
- 26. Come compilare il modulo NDK usando il plugin sperimentale gradle?
- 27. Come collegare librerie statiche (file .a) con APK utilizzando il plugin sperimentale gradle 0.2.0 in Android Studio
- 28. Costruisci più immagini da più file di dati dock
- 29. NDK per AndroidStudio
- 30. Checkout svn utilizzando gradle
Ciao, ho esattamente la stessa preoccupazione, hai trovato un modo per raggiungere questo obiettivo? Saluti. –