2011-06-18 33 views
6

Làm cách nào để biên dịch thư viện bằng mã nguồn?Làm cách nào để biên dịch thư viện bằng mã nguồn bằng các công cụ NDK?

Tôi đang phát triển thư viện gốc với android ndk. Thỉnh thoảng tôi nhận được thông báo kết xuất sự cố từ 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 

Bạn gặp sự cố khi tìm mã nguồn thực tại địa chỉ 2e11c? Tôi tìm kiếm một số giải pháp từ google, ai đó đã nói:

arm-eabi-objdump -S my_library.so 

Nhưng không có mã nguồn trong văn bản đầu ra, chỉ mã lắp ráp ở đó. tôi sử dụng dự án mẫu hello-JNI trong 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 

Có thể chỉ rõ nguồn gốc với tùy chọn -S?


[UPDATE giải pháp 2010/6/19]

Tôi tìm thấy hướng dẫn ndk-gdb: A debuggable JNI example for Android. nó cho biết, kịch bản lệnh ndk-build sẽ giết biểu tượng gỡ lỗi của tôi. Tôi cố gắng tìm ra nó bằng cách 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 

Lệnh sẽ dải biểu tượng gỡ lỗi của tôi:

/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 

Tôi không có ý tưởng để vô hiệu hóa các lệnh dải, vì ndk của tôi phiên bản khác. Tuy nhiên, tôi có thể sử dụng .so trước khi lột trong đường dẫn:

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

Mã nguồn đã trở lại:

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 

Trả lời

0
ndk-build NDK_DEBUG=1 

sẽ giữ biểu tượng cho debug.

+0

Tôi đã thử, nhưng có vẻ như không ổn. /Users/qrtt1/app/android-ndk-r5b/samples/hello-jni/libs/armeabi/libhello-jni.so: ELF 32-bit đối tượng chia sẻ LSB, ARM, phiên bản 1 (SYSV), được liên kết động, tước. ps. Tôi sử dụng android-ndk-r5b – qrtt1

+2

Hmm, trong trường hợp của tôi, obj/local/armeabi/libhello-jni.so luôn là 'không bị tước'. không theo libs/armeabi, dưới obj/local/armeabi. –

Các vấn đề liên quan