2012-09-27 15 views
14

gente,No se encontró JNI_OnLoad saltar init> Aplicación de apagado

estoy trabajando en una aplicación para Android donde necesito un tercero .so biblioteca. Construí esta biblioteca de terceros (con ndk-build) según sus instrucciones y estaba buscando para incluir esto .so en mi proyecto de Android.

Por lo tanto, seguí los pasos descritos en docs/PREBUILTS.html y construí con éxito el nuevo .so en el directorio jni/preconstruido. Ahora traté de aprovechar las instalaciones .so usándolo en una aplicación de prueba de Android. Así que lo que hago es:

static { 
    Log.i("load so > ","load so"); 
    System.loadLibrary("xyz"); 
    } 
/* The native functions */ 
private static native int openFile(String filename); 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    try{ 
     String path = getPathForDownloadDirectoryFile(); 
     Log.i("file path> ", path); 
     int num= openFile(path); 
    }catch(Exception e){ 
     Log.e(">", "could not open the file"); 
    } 
} 

Ahora en que funciono mi aplicación me sale un mensaje de depuración diciendo: No JNI_OnLoad encuentra en /data/data/com.example.myfirstapp/lib/xyz.so 0x411e6738, saltándose init y luego la aplicación se apaga.

Para más información, aquí está el registro de errores:

No JNI_OnLoad found in /data/data/com.example.mysecondapp/lib/xyz.so 0x411e67a0, skipping init 
W/dalvikvm( 570): No implementation found for native Lcom/example/mysecondapp/MainActivity;.openFile:(Ljava/lang/String;)I 
D/AndroidRuntime( 570): Shutting down VM 
W/dalvikvm( 570): threadid=1: thread exiting with uncaught exception (group=0x40a13300) 
E/AndroidRuntime( 570): FATAL EXCEPTION: main 
E/AndroidRuntime( 570): java.lang.UnsatisfiedLinkError: Native method not found: com.example.mysecondapp.MainActivity.openFile:(Ljava/lang/String;)I 
E/AndroidRuntime( 570): at com.example.mysecondapp.MainActivity.openFile(Native Method) 
E/AndroidRuntime( 570): at com.example.mysecondapp.MainActivity.onCreate(MainActivity.java:31) 
E/AndroidRuntime( 570): at android.app.Activity.performCreate(Activity.java:5008) 
E/AndroidRuntime( 570): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
E/AndroidRuntime( 570): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) 
E/AndroidRuntime( 570): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
E/AndroidRuntime( 570): at android.app.ActivityThread.access$600(ActivityThread.java:130) 
E/AndroidRuntime( 570): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
E/AndroidRuntime( 570): at android.os.Handler.dispatchMessage(Handler.java:99) 
E/AndroidRuntime( 570): at android.os.Looper.loop(Looper.java:137) 
E/AndroidRuntime( 570): at android.app.ActivityThread.main(ActivityThread.java:4745) 
E/AndroidRuntime( 570): at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime( 570): at java.lang.reflect.Method.invoke(Method.java:511) 
E/AndroidRuntime( 570): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
E/AndroidRuntime( 570): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
E/AndroidRuntime( 570): at dalvik.system.NativeStart.main(Native Method) 
W/ActivityManager( 146): Force finishing activity com.example.mysecondapp/.MainActivity 

Como se pude ver que la aplicación nativa para el abrirArchivo() método no se encontró pero el mismo lib xyz.so funcionó bastante bien ordenado y con el original aplicación de muestra del tercero. Soy bastante principiante con Android-ndk world.

Java-Android-NDK Ninjas ... ¿adivino qué me podría estar perdiendo? Agradeceré cualquier ayuda aquí :)

Respuesta

16

Como Guycole dijo "No JNI_OnLoad" es solo una advertencia, su problema está en otra parte.

Como usted ha mencionado se ha compilado correctamente el archivo "tan", el problema puede estar en sus firmas de función dentro de su código C/C++ que debe ser algo como esto

JNIEXPORT jint JNICALL Java_com_your_package_class_method(JNIEnv *d, jobject e, jstring f) 
{ 
//some action 

} 

Las firmas de función proviene de el archivo de encabezado que se genera con la herramienta javah. Necesita generar un archivo de encabezado y usar la firma de la función con el nombre de su paquete. Para diferentes nombres de paquete y clase, el archivo de encabezado y la firma de función correspondiente cambiarán.

worked pretty neat with the original sample app from the third party 

Esta podría ser la razón por la que se ejecuta en la aplicación de ejemplo y no en su aplicación.

se refieren: https://thenewcircle.com/s/post/49/using_ndk_to_call_c_code_from_android_apps

+0

¡correcto! ¡el nombre del paquete podría ser el motivo! Déjame probarlo con el embalaje adecuado. Te responderemos, gracias! –

+0

Creo .so con una nueva estructura de paquete que es la mía, pero ahora recibo el error [INSTALL_FAILED_MISSING_SHARED_LIBRARY] al instalar el apk en el dispositivo a pesar de que xyz.so está presente en Project_folder/libs/arm_folder. ¿Alguna idea de lo que podría estar detrás de esto? –

+0

pegue su archivo make y también intente ejecutar el ejemplo dado en el enlace, obtendrá algo de claridad. –

6

El mensaje "No JNI_OnLoad" es solo una advertencia. JNI_OnLoad es un gancho de inicialización opcional.

Supongo que su problema está dentro del método openFile(). Intente comentar la llamada desde Java y vea qué tan lejos llega.

Tengo una publicación en el blog sobre JNI y algunos ejemplos de código en http://guycole.blogspot.com/2012/03/yet-another-android-ndk-blog-posting.html - tal vez lo encuentre útil.

Buena suerte.

+0

Gracias guycole! tu artículo es bastante completo de hecho. –

+0

Exactamente. Tu publicación de blog está bien hecha, también. Un buen toque proporcionar código fuente para devoluciones de llamada JNI en Java. –

2

También viene con este registro

??-?? ??:??:??.???: INFO/(): java.lang.UnsatisfiedLinkError: Couldn't load *: findLibrary returned null

no ??

Creo que es el problema de los archivos android.mk. 1: intenta hacer swith a armabi v7. 2: load funciton llamará a open(). verifica el permiso del así.

0

Como se menciona en las respuestas anteriores, No JNI_OnLoad es solo una advertencia.

Tuve un problema similar, me imaginé que el problema se debía a las operaciones de archivos.

Mi aplicación no estaba teniendo permission.After escritura de almacenamiento externo de añadir el código de abajo en manifiesta que estaba trabajando bien

Cuestiones relacionadas