Uso de bibliotecas pre-construidas y jni en Android Studio
Estoy usando android studio 1.0.2 y estoy tratando de crear una biblioteca de android que utiliza ndk y nativas funciones. Esta es básicamente la arquitectura de mi proyecto:
MyProject ---| MyAndroidApp ---| MyAndroidLibrary ---| jni ---| jniLibs
En mi biblioteca de Android, tengo un solo envoltorio de c ++ que llama a funciones de una biblioteca compartida. He creado esta biblioteca con ndk-build
(funciona perfectamente con eclipse). He añadido esta biblioteca en la carpeta / arquitecturas jniLibs (arm64-v8a, armeabi, armeabi-v7a, mips, mips64, x86 y x86_64). He definido los siguientes sabores en mi MyAndroidLibrary / build.gradle:
- Cómo depurar una aplicación en Android con GDBSERVER?
- Uso de javah en linux
- ¿Cómo obtener la identificación del dispositivo con JNI en Android?
- Jni Tutorial para android
- JNI: Llamar a GetStaticMethodID explotar
productFlavors { x86 { flavorDimension "abi" ndk { abiFilter "x86" } } arm { flavorDimension "abi" ndk { abiFilter "armeabi-v7a" } } mips { flavorDimension "abi" ndk { abiFilter "mips" } } fat { flavorDimension "abi" } }
Sin embargo, cuando intento llamar a mis funciones de la biblioteca del código de jni, consigo un error de referencia undefined. En otras palabras, mi biblioteca compartida parece no estar cargada en el lado jni. Pero, cuando quito la llamada de esta función y exploro el .aar que se crea en la salida, puedo recuperar la biblioteca .so.
No estoy muy familiarizado con gradle cosas, así que no estoy seguro de lo que realmente construir.
Lo que estoy buscando es un equivalente estricto de que Android.mk, utilizando 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)
Me gustaría llamar a funciones de una biblioteca pre-construida en mi código jni, por ejemplo:
#include "MyDLL.h" JNIEXPORT jint JNICALL Java_com_iskn_dbapi_DBAPI_getNegative(JNIEnv *env, jclass obj, jint integer) { return MyDLL::getNegative(integer); }
Gracias por sus respuestas.
- Android, genera archivos de encabezado jni con javah, muestra error que no puede encontrar org.opencv.core.Mat
- No se encontró JNI_OnLoad en ... saltando init
- Cómo obtener un algoritmo de Hashing de archivo rápido para archivos grandes en un dispositivo móvil
- La llamada al método nativo dos veces de una biblioteca de terceros en una actividad hace que la aplicación de Android se cierre
- Cómo utilizar la API de malla experimental con Project Tango
- Cómo mantener un objeto C ++ dentro del código Java? ¿Posible?
- Cómo eliminar soporte nativo de un proyecto de Android en eclipse porque eclipse está mostrando errores en jni?
- No se pudo cargar la aplicación Android SDK
Actualmente, el complemento gradle no admite dicha configuración NDK. Ignora a Android.mk existente y genera uno propio (muy limitado) sobre la marcha. Usted puede ver aquí cómo genera (mirar en el método writeMakefile
) y evaluar por su cuenta cómo limitado es un conjunto de opciones, que afectan a su generación.
Prácticamente, para lograr lo que necesita, la mejor manera sería desactivar completamente el gradle limitado NDK apoyo y llamar ndk-build explícitamente. Lea aquí para más detalles.
- NoClassDefFoundError cuando la versión descendente Androod admite lib de 23.2.0 a 23.1.1
- Aplicación rechazada por Google Pay