JNI的一个多线程问题
鱼塘鱼汤 2013-09-27 10:17:34 场景是这样的,我有一个函数,这个函数一般情况下是在多线程环境下运行的,也就是函数体里面是通过vm->AttachCurrentThread(&env, NULL)来获得env,然后再 vm->DetachCurrentThread(); 同时,我的Android程序也会监听广播,然后在Android的广播处理函数里面调用这个本来给多线程环境设计的函数。但是这种情况下,调用了DetachCurrentThread就会直接Crash。不知道有没有什么比较好的解决方法能够解决这个问题。报错如下:
01-02 23:38:29.070: I/BtOppRfcommListener(817): Accept thread started.
01-02 23:38:29.078: D/BtOppService(817): insertShare parsed URI: content://media/external/images/media/3026
01-02 23:38:29.085: I/DEBUG(104): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
01-02 23:38:29.085: I/DEBUG(104): Build fingerprint: 'Garmin/scorpio/scorpio:4.2.2/JDQ39/eng.yubruce.20130827.085033:eng/test-keys'
01-02 23:38:29.085: I/DEBUG(104): Revision: '16'
01-02 23:38:29.085: I/DEBUG(104): pid: 21329, tid: 21329, name: armin.pnd.hydra >>> com.garmin.pnd.hydra <<<
01-02 23:38:29.085: I/DEBUG(104): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadd00d
01-02 23:38:29.296: I/DEBUG(104): r0 00000000 r1 00000000 r2 deadd00d r3 00000000
01-02 23:38:29.296: I/DEBUG(104): r4 4088a1b0 r5 0000020c r6 00000037 r7 00000000
01-02 23:38:29.296: I/DEBUG(104): r8 00000002 r9 56aa6d98 sl 40b44020 fp bef1e5f4
01-02 23:38:29.296: I/DEBUG(104): ip 00004000 sp bef1e2f0 lr 400e40e9 pc 40821c90 cpsr 60000130
01-02 23:38:29.296: I/DEBUG(104): d0 74726f6261204d56 d1 617453657669746e
01-02 23:38:29.296: I/DEBUG(104): d2 4965746f67795a75 d3 6e69616d2e74696c
01-02 23:38:29.296: I/DEBUG(104): d4 000009061f001f00 d5 42c6000038aa759f
01-02 23:38:29.296: I/DEBUG(104): d6 0006b48442c60000 d7 411ad21000000000
01-02 23:38:29.296: I/DEBUG(104): d8 0000000000000000 d9 0000000000000000
01-02 23:38:29.296: I/DEBUG(104): d10 0000000000000000 d11 0000000000000000
01-02 23:38:29.296: I/DEBUG(104): d12 0000000000000000 d13 0000000000000000
01-02 23:38:29.296: I/DEBUG(104): d14 0000000000000000 d15 0000000000000000
01-02 23:38:29.296: I/DEBUG(104): d16 7fffffffffffffff d17 7fffffffffffffff
01-02 23:38:29.296: I/DEBUG(104): d18 0000000000000000 d19 3f6c5037dc71e023
01-02 23:38:29.296: I/DEBUG(104): d20 3fa54b4173013230 d21 3fb54b417301322c
01-02 23:38:29.296: I/DEBUG(104): d22 3fa54636a32e497a d23 bfd27549a22168c2
01-02 23:38:29.296: I/DEBUG(104): d24 0067006700670067 d25 0067006700670067
01-02 23:38:29.296: I/DEBUG(104): d26 0067006700670067 d27 0067006700670067
01-02 23:38:29.296: I/DEBUG(104): d28 0100010001000100 d29 0100010001000100
01-02 23:38:29.296: I/DEBUG(104): d30 0000000100000001 d31 0000000100000001
01-02 23:38:29.296: I/DEBUG(104): scr 20000091
01-02 23:38:29.304: I/DEBUG(104): backtrace:
01-02 23:38:29.304: I/DEBUG(104): #00 pc 00045c90 /system/lib/libdvm.so (dvmAbort+75)
01-02 23:38:29.304: I/DEBUG(104): #01 pc 00053c4d /system/lib/libdvm.so (dvmDetachCurrentThread()+60)
01-02 23:38:29.312: I/DEBUG(104): #02 pc 00048d3d /system/lib/libdvm.so
01-02 23:38:29.312: I/DEBUG(104): #03 pc 0003a0e9 /system/lib/libdvm.so
01-02 23:38:29.312: I/DEBUG(104): #04 pc 00ca8994 /data/app-lib/com.garmin.pnd.hydra-2/libsys.so (gjni_detach+24)
01-02 23:38:29.312: I/DEBUG(104): #05 pc 00b37a10 /data/app-lib/com.garmin.pnd.hydra-2/libsys.so (btm_set_bluetooth_state+60)
01-02 23:38:29.312: I/DEBUG(104): #06 pc 00caafb0 /data/app-lib/com.garmin.pnd.hydra-2/libsys.so (onBtStateChangedNative+108)
01-02 23:38:29.312: I/DEBUG(104): #07 pc 0001e290 /system/lib/libdvm.so (dvmPlatformInvoke+112)
01-02 23:38:29.312: I/DEBUG(104): #08 pc 0004d411 /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+396)
01-02 23:38:29.312: I/DEBUG(104): #09 pc 00038c05 /system/lib/libdvm.so (dvmCheckCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+8)
01-02 23:38:29.312: I/DEBUG(104): #10 pc 000276a0 /system/lib/libdvm.so
01-02 23:38:29.312: I/DEBUG(104): #11 pc 0002b57c /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
01-02 23:38:29.312: I/DEBUG(104): #12 pc 0005ff07 /system/lib/libdvm.so (dvmInvokeMethod(Object*, Method const*, ArrayObject*, ArrayObject*, ClassObject*, bool)+374)
01-02 23:38:29.312: I/DEBUG(104): #13 pc 000677e1 /system/lib/libdvm.so
01-02 23:38:29.312: I/DEBUG(104): #14 pc 000276a0 /system/lib/libdvm.so
01-02 23:38:29.312: I/DEBUG(104): #15 pc 0002b57c /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
01-02 23:38:29.312: I/DEBUG(104): #16 pc 0005fc31 /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+272)
01-02 23:38:29.312: I/DEBUG(104): #17 pc 000499fb /system/lib/libdvm.so
01-02 23:38:29.312: I/DEBUG(104): #18 pc 0003cf5b /system/lib/libdvm.so
01-02 23:38:29.312: I/DEBUG(104): #19 pc 000469e9 /system/lib/libandroid_runtime.so
01-02 23:38:29.312: I/DEBUG(104): #20 pc 000476ab /system/lib/libandroid_runtime.so (android::AndroidRuntime::start(char const*, char const*)+390)