ubicacion studio ruta not ndk configured android android-ndk

studio - Android NDK C++ JNI(no se encontró implementación para el nativo...)



ruta ndk android (9)

Estoy tratando de usar el NDK con C ++ y parece que no puedo obtener la convención de nomenclatura del método correcta. mi método nativo es el siguiente:

extern "C" { JNIEXPORT void JNICALL Java_com_test_jnitest_SurfaceRenderer_drawFromJni (JNIEnv* env, jclass c) { // } }

con un encabezado envuelto en extern "C" {} aslo.

Todo se compila bien, crea un archivo .so y se copia a la carpeta libs de mi proyecto, pero cuando depuro y corro en Eclipse sigo recibiendo un mensaje de log cat que dice "no se encontró ninguna implementación para el nativo ...". ¿Hay algo que me falta ya que todos los ejemplos de NDK están en C?

Gracias.


Use javah (parte de Java SDK). Es la herramienta exactamente para esto (genera el encabezado .h del archivo .class).


Tuve el mismo problema, pero para mí el error estaba en el archivo Android.mk. Lo tuve:

LOCAL_SRC_FILES := A.cpp LOCAL_SRC_FILES := B.cpp

pero debería tener esto:

LOCAL_SRC_FILES := A.cpp LOCAL_SRC_FILES += B.cpp

tenga en cuenta el detalle + = en cambio : =

Espero que eso ayude.


Una razón adicional: use LOCAL_WHOLE_STATIC_LIBRARIES en lugar de LOCAL_STATIC_LIBRARIES en android.mk. Esto evita que la biblioteca optimice las llamadas API no utilizadas porque el NDK no puede detectar el uso de las vinculaciones nativas del código java.


Una causa adicional de este error: ¡su nombre de método nativo no decorado no debe contener un guión bajo!

Por ejemplo, quería exportar una función C llamada AudioCapture_Ping() . Aquí está mi declaración de exportación en C:

JNI_EXPORT int Java_com_obsidian_mobilehashhost_MainActivity_AudioCapture_Ping(JNIEnv *pJniEnv, jobject object); //Notice the underscore before Ping

Aquí estaba mi clase Java importando la función:

package com.obsidian.mobileaudiohashhost; ... public class MainActivity extends Activity { private native int AudioCapture_Ping(); // FAILS ...

No pude lograr que Android vincule dinámicamente mi método nativo hasta que eliminé el guión bajo:

JNI_EXPORT int Java_com_obsidian_mobilehashhost_MainActivity_AudioCapturePing(JNIEnv *pJniEnv, jobject object); package com.obsidian.mobileaudiohashhost; ... public class MainActivity extends Activity { private native int AudioCapturePing(); // THIS WORKS! ...



Hay un par de cosas que pueden llevar a que "no se encuentre implementación". Uno está obteniendo el nombre del prototipo de función incorrecto, otro está fallando al cargar el .so en absoluto. ¿Estás seguro de que se está llamando a System.loadLibrary() antes de usar el método?

Si no tiene definida una función JNI_OnLoad , puede crear una y hacer que escuche un mensaje de registro solo para verificar que la lib se está ejecutando correctamente.

Ya eludiste el problema más común, olvidándote de usar la extern "C" , por lo que es el anterior o un ligero error de ortografía. ¿Cómo se ve la declaración de Java?


Llamado extern "C" como se proporciona en el ejemplo de Studio generado automáticamente, pero se olvidó de envolver todo el resto del archivo, incluidas las siguientes funciones, en {} corchetes. Solo la primera función funcionó.


Intento todas las soluciones anteriores, pero nadie puede resolver mi error de compilación (jni java.lang.UnsatisfiedLinkError: no se encontró ninguna implementación para ...), finalmente encontré que olvidé agregar mi archivo fuente verify.cpp a CMakeList.txt add_library segement (verify.cpp se genera automáticamente con Ctrl + tecla de acceso rápido, tal vez otro nombre de archivo), espero que mi respuesta pueda ayudar a alguien.

mi entorno de construcción: Gradle + CMake


Enfrenté el mismo problema, y ​​en mi caso la razón fue que tenía un guión bajo en el nombre del paquete "RFID_Test". Cambié el nombre del paquete y funcionó. Gracias user1222021