2015-01-30 14 views
5

Uso Android Studio 1.0.2 e sto provando a creare una libreria Android che utilizza le funzioni ndk e native. Questo è fondamentalmente l'architettura del mio progetto:Utilizzo di librerie predefinite e jni in Android Studio

MyProject 
---| MyAndroidApp 
---| MyAndroidLibrary 
    ---| jni 
    ---| jniLibs 

Nella mia biblioteca Android, Ho un singolo involucro C++ che chiama le funzioni da una libreria condivisa. Ho creato questa libreria con ndk-build (funziona perfettamente con eclipse). Ho aggiunto questa libreria nella cartella/architetture jniLibs (arm64-v8a, armeabi, armeabi-v7a, mips, mips64, x86 e x86_64). ho definito i seguenti Sapori nel mio MyAndroidLibrary/build.gradle:

productFlavors { 
    x86 { 
     flavorDimension "abi" 
     ndk { 
      abiFilter "x86" 
     } 
    } 
    arm { 
     flavorDimension "abi" 
     ndk { 
      abiFilter "armeabi-v7a" 
     } 
    } 
    mips { 
     flavorDimension "abi" 
     ndk { 
      abiFilter "mips" 
     } 
    } 
    fat { 
     flavorDimension "abi" 
    } 
} 

Tuttavia, quando provo a chiamare i miei funzioni di libreria dal codice JNI, ottengo un errore di riferimento non definito. In altre parole, la mia libreria condivisa sembra non essere caricata sul lato jni. Ma, quando rimuovo la chiamata di queste funzioni ed esploro il file .aar creato in output, posso recuperare la libreria .so.

Non ho molta familiarità con le cose gradle, quindi non sono sicuro di cosa sia realmente costruito.

Quello che sto cercando è un rigoroso equivalente di quel Android.mk, utilizzando Gradle:

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_MODULE   := mysharedlib 
LOCAL_SRC_FILES   := ../shared/mysharedlib.so 
LOCAL_EXPORT_C_INCLUDES := ../shared/includes/mysharedlib.h 

include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS) 

LOCAL_MODULE   := jni 
LOCAL_SRC_FILES   := jni.cpp 
LOCAL_C_INCLUDES  += ../shared/includes/mysharedlib.h 
LOCAL_LDLIBS   := -llog 
LOCAL_SHARED_LIBRARIES := mysharedlib 

include $(BUILD_SHARED_LIBRARY) 

Vorrei richiamare le funzioni da una libreria di pre-costruito sul mio codice JNI, ad esempio:

#include "MyDLL.h" 

JNIEXPORT jint JNICALL Java_com_iskn_dbapi_DBAPI_getNegative(JNIEnv *env, jclass obj, jint integer) 
{ 
    return MyDLL::getNegative(integer); 
} 

Grazie per le vostre risposte.

+0

Hai finalmente sistemato questo? –

risposta

1

Attualmente il plug-in gradle non supporta tale configurazione NDK. Ignora Android.mk esistente e genera il proprio (molto limitato) al volo. Puoi vedere here come si genera (guarda nel metodo writeMakefile) e valutare da solo quanto sia limitato l'insieme di opzioni, che influisce sulla sua generazione.

In pratica, per ottenere ciò che è necessario, il modo migliore sarebbe disabilitare completamente il supporto NDK limitato a gradle e chiamare esplicitamente ndk-build. Leggi here per i dettagli.

+0

Grazie per la risposta. Beh, in realtà, ho bisogno di un gradle per creare un .aar. Ma la cartella jniLibs non dovrebbe costruire le librerie predefinite che include? Secondo questo [collegamento] (http://www.hellsoft.se/android/android-ndk-and-the-gradle-build-system/), consultare la sezione Pre-Built librairies. – Sierra

+0

Scusa, non ho capito cosa hai chiesto. Potresti riformulare la tua domanda? BTW, nel link qui sopra, puoi vedere la riga 'sourceSets.main.jniLibs.srcDir 'src/main/libs'' - questo significa che la cartella verrebbe usata per il confezionamento di librerie native in APK, non in' jniLibs '. –

+0

Sicuro. Quello di cui ho bisogno è un .aar (archivio Android) che conterrà la mia libreria condivisa. E per quello, devo usare il gradle, non è vero? Un'altra cosa è che ho visto sul link postato sopra che tutte le librerie nelle cartelle jniLibs dovrebbero essere automaticamente pre-compilate, giusto? – Sierra