Android 2.3上的弱全球参考不起作用(JNI)

时间:2013-01-09 09:11:05

标签: android java-native-interface dalvik weak-references

对于JNI,我正在创建一个来自作业的弱全局引用。后来,当试图访问此引用时,dalvik vm在Android 2.3上崩溃,但在4.1和4.2上没有崩溃。我发现IsSameObject与对象本身和创建的弱引用作为参数在工作设备上返回1,在它崩溃的设备上返回0。那有意义吗?更改为GlobalRef和IsSameObject将返回1.

这里我在创建弱全局引用后立即测试IsSameObject。

this->jMyObject = getEnv()->NewWeakGlobalRef(jMyObject);
LOGV("Is same object = %d", getEnv()->IsSameObject(jMyObject, this->jMyObject));

LOGV是我打印到logcat的宏。

崩溃日志对我没有多大帮助:

01-09 09:57:04.778: I/DEBUG(13012): Build fingerprint: 'google/passion/passion:2.3.7/GWK74/121341:user/release-keys'
01-09 09:57:04.778: I/DEBUG(13012): pid: 15001, tid: 15001  >>> org.example.myproject <<<
01-09 09:57:04.778: I/DEBUG(13012): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr de5d8e6f
01-09 09:57:04.778: I/DEBUG(13012):  r0 0018fed8  r1 00000007  r2 de5d8e6f  r3 00000002
01-09 09:57:04.778: I/DEBUG(13012):  r4 437d45d4  r5 431ecda8  r6 beb54098  r7 000010f8
01-09 09:57:04.778: I/DEBUG(13012):  r8 aca12000  r9 0000000c  10 431ecd94  fp aca9f368
01-09 09:57:04.778: I/DEBUG(13012):  ip 000000f8  sp beb54048  lr aca15e2c  pc aca15e18  cpsr a0000010
01-09 09:57:04.778: I/DEBUG(13012):  d0  0065007200670067  d1  006e006900730000
01-09 09:57:04.778: I/DEBUG(13012):  d2  275449202121213a  d3  4546455220412000
01-09 09:57:04.778: I/DEBUG(13012):  d4  8000000000000000  d5  429800003f800000
01-09 09:57:04.778: I/DEBUG(13012):  d6  00000000c2980000  d7  4110000042500000
01-09 09:57:04.778: I/DEBUG(13012):  d8  0000000043eb0000  d9  c35c0000439ce2e0
01-09 09:57:04.778: I/DEBUG(13012):  d10 433d5140405277a8  d11 0000000042354500
01-09 09:57:04.778: I/DEBUG(13012):  d12 0000000000000000  d13 0000000000000000
01-09 09:57:04.778: I/DEBUG(13012):  d14 0000000000000000  d15 0000000000000000
01-09 09:57:04.778: I/DEBUG(13012):  d16 000000000065dea0  d17 c053000000000000
01-09 09:57:04.778: I/DEBUG(13012):  d18 0000000000000000  d19 0000000000000000
01-09 09:57:04.778: I/DEBUG(13012):  d20 3ff0000000000000  d21 8000000000000000
01-09 09:57:04.778: I/DEBUG(13012):  d22 0000000000000000  d23 0000000000000000
01-09 09:57:04.778: I/DEBUG(13012):  d24 0000000000000000  d25 407c000000000000
01-09 09:57:04.778: I/DEBUG(13012):  d26 4030000000000000  d27 3ff0000000000000
01-09 09:57:04.778: I/DEBUG(13012):  d28 0100010001000100  d29 3ff0000000000000
01-09 09:57:04.778: I/DEBUG(13012):  d30 0000000000000000  d31 3ff0000000000000
01-09 09:57:04.778: I/DEBUG(13012):  scr 20000010
01-09 09:57:04.828: I/DEBUG(13012):          #00  pc 00015e18  /system/lib/libdvm.so
01-09 09:57:04.828: I/DEBUG(13012):          #01  pc 0001c0e4  /system/lib/libdvm.so
01-09 09:57:04.828: I/DEBUG(13012):          #02  pc 0001afdc  /system/lib/libdvm.so
01-09 09:57:04.828: I/DEBUG(13012):          #03  pc 00059c40  /system/lib/libdvm.so
01-09 09:57:04.828: I/DEBUG(13012):          #04  pc 00046666  /system/lib/libdvm.so
01-09 09:57:04.828: I/DEBUG(13012):          #05  pc 001b0d3e  /data/data/org.example/lib/libmyproject.so
01-09 09:57:04.828: I/DEBUG(13012):          #06  pc 001b4c7e  /data/data/org.example/lib/libmyproject.so

我是否需要从引用中提取对象?或者我应该完全避免弱引用?

1 个答案:

答案 0 :(得分:4)

如果我把弱引用放在NewLocalRef中,它似乎做得很好。 所以我最终得到了:

jobject jMyObject = getEnv()->NewLocalRef(jMyWeakObject);
if(!getEnv()->IsSameObject(jMyObject, NULL)) {
    // do stuff with object
}

成员变量现在是jMyWeakObject。