2014-06-24 15 views
5

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

+1

Ciao, ho esattamente la stessa preoccupazione, hai trovato un modo per raggiungere questo obiettivo? Saluti. –

risposta

1

È 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.

+0

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

+0

@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

+0

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

Problemi correlati