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.
Hai finalmente sistemato questo? –