2011-06-18 14 views
6

¿Cómo compilar la biblioteca con el código fuente?¿Cómo compilar la biblioteca con el código fuente con las herramientas NDK?

Estoy desarrollando la biblioteca nativa con Android ndk. A veces obtengo los mensajes de volcado de bloqueo de logcat.

06-18 15:24:58.545: INFO/DEBUG(24667): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 
06-18 15:24:58.545: INFO/DEBUG(24667): Build fingerprint: 'nvidia/harmony/harmony/harmony:2.2/FRF91/20110304.134348:eng/test-keys' 
06-18 15:24:58.545: INFO/DEBUG(24667): pid: 25870, tid: 26261 >>> com.andtv <<< 
06-18 15:24:58.545: INFO/DEBUG(24667): signal 11 (SIGSEGV), fault addr 4a7b041c 
06-18 15:24:58.545: INFO/DEBUG(24667): r0 4a7b041c r1 4a75220c r2 00000200 r3 0000006d 
06-18 15:24:58.545: INFO/DEBUG(24667): r4 4a7b041d r5 00000000 r6 82434ad0 r7 4a752768 
06-18 15:24:58.545: INFO/DEBUG(24667): r8 4a75220c r9 000004b4 10 4a752777 fp 00000000 
06-18 15:24:58.545: INFO/DEBUG(24667): ip 00000000 sp 4a7521f8 lr 8202e11f pc afd1d9cc cpsr 00000030 
06-18 15:24:58.545: INFO/DEBUG(24667): d0 3fcc745e0ab0ad85 d1 3fd24aaf828e1369 
06-18 15:24:58.545: INFO/DEBUG(24667): d2 3fa56e5ff7cd8dc6 d3 3fe5568b9401f367 
06-18 15:24:58.545: INFO/DEBUG(24667): d4 bfc34e892d87a4ea d5 bfd1c2b0f8ac7dc9 
06-18 15:24:58.545: INFO/DEBUG(24667): d6 3fe62e42fee00000 d7 3ff0000000000000 
06-18 15:24:58.545: INFO/DEBUG(24667): d8 4190000044038000 d9 4260000000000000 
06-18 15:24:58.545: INFO/DEBUG(24667): d10 423999a0423999a0 d11 0000000000000000 
06-18 15:24:58.545: INFO/DEBUG(24667): d12 0000000000000000 d13 0000000000000000 
06-18 15:24:58.545: INFO/DEBUG(24667): d14 0000000000000000 d15 0000000000000000 
06-18 15:24:58.545: INFO/DEBUG(24667): scr 80000012 
06-18 15:24:58.565: ERROR/OMXPlayer(942): waiting to prepare 0x2b8fb0 
06-18 15:24:58.925: INFO/DEBUG(24667):   #00 pc 0001d9cc /system/lib/libc.so 
06-18 15:24:58.925: INFO/DEBUG(24667):   #01 pc 0002e11c /data/data/com.andtv/lib/libffmpeg.so 

Es un problema de cómo encontrar el código fuente real en dirección 2e11c? que busco algunas soluciones de Google, alguien dijo:

arm-eabi-objdump -S my_library.so 

Pero ningún código fuente en el texto de salida, sólo el código de montaje allí. utilizo la muestra JNI hola-proyecto en el ndk5r:

qty:jni qrtt1$ arm-eabi-objdump -S ../libs/armeabi/libhello-jni.so 

../libs/armeabi/libhello-jni.so:  file format elf32-littlearm 


Disassembly of section .text: 

000002dc <Java_com_example_hellojni_HelloJni_stringFromJNI>: 
2dc: b500   push {lr} 
2de: b083   sub  sp, #12 
2e0: 9001   str  r0, [sp, #4] 
2e2: 9100   str  r1, [sp, #0] 
2e4: 9b01   ldr  r3, [sp, #4] 
2e6: 681a   ldr  r2, [r3, #0] 
2e8: 23a7   movs r3, #167 
2ea: 009b   lsls r3, r3, #2 
2ec: 58d2   ldr  r2, [r2, r3] 
2ee: 9901   ldr  r1, [sp, #4] 
2f0: 4b04   ldr  r3, [pc, #16] (304 <Java_com_example_hellojni_HelloJni_stringFromJNI+0x28>) 
2f2: 447b   add  r3, pc 
2f4: 1c08   adds r0, r1, #0 
2f6: 1c19   adds r1, r3, #0 
2f8: 4790   blx  r2 
2fa: 1c03   adds r3, r0, #0 
2fc: 1c18   adds r0, r3, #0 
2fe: b003   add  sp, #12 
300: bd00   pop  {pc} 
302: 46c0   nop      (mov r8, r8) 
304: 0012   lsls r2, r2, #0 

¿Es posible mostrar la fuente con la opción -S?


[ACTUALIZACIÓN solución 2010/06/19]

I encontró el tutorial NDK-BGF: A debuggable JNI example for Android. Decía, el script ndk-build matará mi símbolo de depuración. Trato de averiguar por runing NDK-build V = 1:

qty:jni qrtt1$ ndk-build V=1 
\rm -f /Users/qrtt1/app/android-ndk-r5b/samples/hello-jni/libs/armeabi/lib*.so /Users/qrtt1/app/android-ndk-r5b/samples/hello-jni/libs/armeabi-v7a/lib*.so /Users/qrtt1/app/android-ndk-r5b/samples/hello-jni/libs/x86/lib*.so 
rm -f /Users/qrtt1/app/android-ndk-r5b/samples/hello-jni/libs/armeabi/gdbserver /Users/qrtt1/app/android-ndk-r5b/samples/hello-jni/libs/armeabi-v7a/gdbserver /Users/qrtt1/app/android-ndk-r5b/samples/hello-jni/libs/x86/gdbserver 
rm -f /Users/qrtt1/app/android-ndk-r5b/samples/hello-jni/libs/armeabi/gdb.setup /Users/qrtt1/app/android-ndk-r5b/samples/hello-jni/libs/armeabi-v7a/gdb.setup /Users/qrtt1/app/android-ndk-r5b/samples/hello-jni/libs/x86/gdb.setup 
Gdbserver  : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver 
mkdir -p /Users/qrtt1/app/android-ndk-r5b/samples/hello-jni/libs/armeabi 
install -p /Users/qrtt1/app/android-ndk-r5b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver /Users/qrtt1/app/android-ndk-r5b/samples/hello-jni/libs/armeabi/gdbserver 
Gdbsetup  : libs/armeabi/gdb.setup 
echo "set solib-search-path /Users/qrtt1/app/android-ndk-r5b/samples/hello-jni/obj/local/armeabi" > /Users/qrtt1/app/android-ndk-r5b/samples/hello-jni/libs/armeabi/gdb.setup 
echo "directory /Users/qrtt1/app/android-ndk-r5b/platforms/android-8/arch-arm/usr/include /Users/qrtt1/app/android-ndk-r5b/samples/hello-jni/jni /Users/qrtt1/app/android-ndk-r5b/sources/cxx-stl/system" >> /Users/qrtt1/app/android-ndk-r5b/samples/hello-jni/libs/armeabi/gdb.setup 
Install  : libhello-jni.so => libs/armeabi/libhello-jni.so 
mkdir -p /Users/qrtt1/app/android-ndk-r5b/samples/hello-jni/libs/armeabi 
install -p /Users/qrtt1/app/android-ndk-r5b/samples/hello-jni/obj/local/armeabi/libhello-jni.so /Users/qrtt1/app/android-ndk-r5b/samples/hello-jni/libs/armeabi/libhello-jni.so 
/Users/qrtt1/app/android-ndk-r5b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-strip --strip-unneeded /Users/qrtt1/app/android-ndk-r5b/samples/hello-jni/libs/armeabi/libhello-jni.so 

El comando se tira de mi símbolos de depuración:

/Users/qrtt1/app/android-ndk-r5b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-strip --strip-unneeded /Users/qrtt1/app/android-ndk-r5b/samples/hello-jni/libs/armeabi/libhello-jni.so 

no tengo ni idea deshabilitar el comando tira, porque mi NDK la versión es diferente Sin embargo, puedo usar el .so antes despojado en la ruta:

/Users/qrtt1/app/android-ndk-r5b/samples/hello-jni/obj/local/armeabi/libhello-jni.so 

El código fuente está de vuelta:

qty:jni qrtt1$ arm-eabi-objdump -S /Users/qrtt1/app/android-ndk-r5b/samples/hello-jni/obj/local/armeabi/libhello-jni.so 

/Users/qrtt1/app/android-ndk-r5b/samples/hello-jni/obj/local/armeabi/libhello-jni.so:  file format elf32-littlearm 


Disassembly of section .text: 

000002dc <Java_com_example_hellojni_HelloJni_stringFromJNI>: 
* apps/samples/hello-jni/project/src/com/example/HelloJni/HelloJni.java 
*/ 
jstring 
Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv* env, 
                jobject thiz) 
{ 
2dc: b500   push {lr} 
2de: b083   sub  sp, #12 
2e0: 9001   str  r0, [sp, #4] 
2e2: 9100   str  r1, [sp, #0] 
    return (*env)->NewStringUTF(env, "Hello from JNI !"); 
2e4: 9b01   ldr  r3, [sp, #4] 
2e6: 681a   ldr  r2, [r3, #0] 
2e8: 23a7   movs r3, #167 
2ea: 009b   lsls r3, r3, #2 
2ec: 58d2   ldr  r2, [r2, r3] 
2ee: 9901   ldr  r1, [sp, #4] 
2f0: 4b04   ldr  r3, [pc, #16] (304 <Java_com_example_hellojni_HelloJni_stringFromJNI+0x28>) 
2f2: 447b   add  r3, pc 
2f4: 1c08   adds r0, r1, #0 
2f6: 1c19   adds r1, r3, #0 
2f8: 4790   blx  r2 
2fa: 1c03   adds r3, r0, #0 
} 
2fc: 1c18   adds r0, r3, #0 
2fe: b003   add  sp, #12 
300: bd00   pop  {pc} 
302: 46c0   nop      (mov r8, r8) 
304: 00000012  .word 0x00000012 

Respuesta

0
ndk-build NDK_DEBUG=1 

mantendrá el símbolo de depuración.

+0

Lo he probado, pero parece que no está bien. /Users/qrtt1/app/android-ndk-r5b/samples/hello-jni/libs/armeabi/libhello-jni.so: ELF Objeto compartido LSF de 32 bits, ARM, versión 1 (SYSV), vinculado dinámicamente, despojado p. Yo uso android-ndk-r5b – qrtt1

+2

Hmm, en mi caso, obj/local/armeabi/libhello-jni.so siempre es 'no eliminado'. no bajo libs/armeabi, bajo obj/local/armeabi. –

Cuestiones relacionadas