场景是这样的,我有一个函数,这个函数一般情况下是在多线程环境下运行的,也就是函数体里面是通过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)
android多线程jni

解决方案 »

  1.   

    java调用jni时,对应的jni函数有ENV的指针,直接引用就行了。如需回调到java层则也需要使用该env指针,否则奔溃。java每次执行jni函数都是在不同的函数,每次的env都不一样,注意了!
    另外一个就是java传下来的数组 在使用完后必须release否则,长时间运行,也会奔溃。
      

  2.   

    java调用jni时,对应的jni函数有ENV的指针,直接引用就行了。如需回调到java层则也需要使用该env指针,否则奔溃。java每次执行jni函数都是在不同的线程中,每次的env都不一样,注意了!
    另外一个就是java传下来的数组 在使用完后必须release否则,长时间运行,也会奔溃。