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
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
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. –