Intereting Posts

Как скомпилировать библиотеку с исходным кодом с помощью инструментов NDK?

Как скомпилировать библиотеку с исходным кодом?

Я разрабатываю собственную библиотеку с помощью android ndk. Иногда я получал сообщения аварийного дампа с 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 

Проблема в том, как найти настоящий исходный код по адресу 2e11c? Я искал некоторые решения от Google, кто-то сказал:

 arm-eabi-objdump -S my_library.so 

Но в исходном тексте нет исходного кода, там есть только код сборки. Я использую проект hello- jni в 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 

Можно ли показать источник с параметром -S?


[ОБНОВЛЕНИЕ решения 2010/06/19]

Я нашел учебник ndk-gdb: отлаживаемый пример JNI для Android . Он сказал, скрипт ndk-build убьет мой символ отладки. Я пытаюсь это выяснить, запустив 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 

Команда отключит мой отладочный символ:

 /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 

Я не знаю, как отключить команду strip, потому что моя версия ndk отличается. Тем не менее, я могу использовать .so перед тем, как удалить путь:

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

Исходный код вернулся:

 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 

 ndk-build NDK_DEBUG=1 

Сохранит символ для отладки.