Estoy tratando de usar el NDK con C ++ y parece que no puedo conseguir que la convención de nomenclatura del método sea 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" {} también.
Todo se compila bien, crea un archivo .so y lo copia en la carpeta libs debajo de mi proyecto, pero cuando depuro y ejecuto en Eclipse sigo recibiendo un mensaje de log cat que dice "no se encontró implementación para nativo ...". ¿Hay algo que me falta ya que todos los ejemplos de NDK están en C?
Gracias.
android
android-ndk
Patrick Kafka
fuente
fuente
javah
? Si no, deberías estarlo. :-PSystem.loadLibrary
Respuestas:
Hay un par de cosas que pueden llevar a que "no se encuentre implementación". Uno está equivocando el nombre del prototipo de la función, otro no carga el .so en absoluto. ¿Estás seguro de que
System.loadLibrary()
se está llamando antes de que se utilice el método?Si no tiene una
JNI_OnLoad
función definida, es posible que desee crear una y hacer que escupe un mensaje de registro solo para verificar que la biblioteca se esté ingresando correctamente.Ya esquivó el problema más común, olvidarse de usar
extern "C"
, por lo que es lo anterior o un pequeño error ortográfico. ¿Cómo se ve la declaración de Java?fuente
Una causa adicional de este error: el nombre de su método nativo sin decorar no debe contener un guión bajo.
Por ejemplo, quería exportar una función de 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 de Java importando la función:
package com.obsidian.mobileaudiohashhost; ... public class MainActivity extends Activity { private native int AudioCapture_Ping(); // FAILS ...
No pude hacer que Android se vincule dinámicamente a mi método nativo hasta que elimine 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! ...
fuente
Tuve el mismo problema, pero para mí el error estaba en el archivo Android.mk. Lo tuve:
pero debería tener esto:
nota el detalle + = en su lugar : =
Espero que eso ayude.
fuente
Llamado externo "C" como se indica en el ejemplo de Studio generado automáticamente, pero se olvidó de envolver todo el resto del archivo, incluidas las funciones siguientes, entre corchetes {}. Solo funcionó la primera función.
fuente
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 los enlaces nativos del código Java.
fuente
Hay un ejemplo de cpp en aplicaciones en ndk: https://github.com/android/ndk-samples/blob/master/hello-gl2/app/src/main/cpp/gl_code.cpp
fuente
Utilice javah (parte del SDK de Java). Es la herramienta exactamente para esto (genera un encabezado .h a partir del archivo .class).
fuente
Si el nombre de su paquete incluye el carácter _, debe escribir 1 (uno) después del carácter _ como se muestra a continuación:
MainActivity.java
package com.example.testcpp_2;
native-lib.cpp
fuente
Intento todas las soluciones anteriores, pero nadie puede resolver mi error de compilación (jni java.lang.UnsatisfiedLinkError: No se encontró implementación para ...), finalmente descubrí que olvidé agregar mi archivo fuente verify.cpp a CMakeList.txt add_library segement (verify.cpp se genera automáticamente mediante Ctrl + Enter tecla corta, tal vez otro nombre de archivo), espero que mi respuesta pueda ayudar a alguien.
mi entorno de compilación: Gradle + CMake
fuente
Enfrenté el mismo problema y, en mi caso, la razón fue que tenía un subrayado en el nombre del paquete "RFID_Test". Cambié el nombre del paquete y funcionó. Gracias user1222021
fuente
Enfrenté el mismo problema dos veces. Sucedió que el teléfono que intenté iniciar la aplicación desde Android Studio usaba un nivel de API que aún no había descargado en Android Studio.
fuente