2011-05-23 33 views
5

Recopilé mis fuentes c con android-ndk luego puse el archivo .so en la carpeta libs de mi proyecto android pero cuando llamo a la función nativa tengo un error "No se encontró implementación para native" . Si trato de llamar a esta función desde adb shell todo funciona bien, así que no entiendo por qué ese error. Por favor, ayuda, AndreaNo se encontró implementación para native

Respuesta

14

Hay un esquema de nombres exacto relacionado con JNI que no es muy obvio. Tal vez la implementación de su función no se ajusta a eso?

Por ejemplo, si desea poder llamar a una función nativa llamada startServer desde su código JAVA, suponiendo que su paquete se llama com.example.something y su clase se llama MyClass, debe tener una función de miembro en su clase Java, así:

private native void startServer(); 

Y entonces su aplicación JNI debe tener este aspecto:

JNIEXPORT void Java_com_example_something_MyClass_startServer(JNIEnv *env, jobject obj) { 

// Do something here... 

} 

De lo contrario, hay un error de vinculación.

+0

mi paquete es: paquete upmt.os; y la función: public static native String upmtconf (String [] param); en la clase de Módulo. En el código c, la implementación es JNIEXPORT jstring JNICALL Java_upmt_os_Module_upmtconf (JNIEnv * env, jobject obj, jobjectArray param) –

+0

Publique la salida de logcat para llamar a su función: tiene el nombre exacto que busca el enlazador. Si tienes algún tipo de error tipográfico, es una buena forma de atraparlo. – gby

+0

Lo resolví. solo fue un error en el archivo MAKE con un definir. gracias de todos modos –

12

Otra razón puede conseguir esto, es que si no estás llamando a su biblioteca en el momento que usted está haciendo una llamada a la función JNI:

static { 
    System.loadLibrary("myJNIFILE"); 
} 

debe ser llamado en algún lugar antes de la referencia real a una función JNI.

+0

¡Tienes toda la razón! Tenía una aplicación que funciona correctamente pero agregué pantallas iniciales adicionales (vistas) y bloqueos de la aplicación (tuve una advertencia de JNI quejándose de que no se podía encontrar un método "nativo"). Finalmente moví la llamada: \t estático { \t \t System.loadLibrary ("mylibrary"); \t} en la actividad responsable del lanzamiento de la aplicación. – Genar

Cuestiones relacionadas