android - Android 2.3 上的弱全局引用不起作用 (JNI)

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

使用 JNI,我正在从一个 jobject 创建一个弱全局引用。后来,当尝试访问此引用时,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

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

最佳答案

如果我将弱引用放在 NewLocalRef 中,它似乎运行良好。 所以我最终得到了:

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

成员变量现在是jMyWeakObject。

关于android - Android 2.3 上的弱全局引用不起作用 (JNI),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14231685/

相关文章:

android - 使用 Spannable 的 TextView - ellipsize 不起作用

java - 使用Qt/C++通过JNI调用Java代码。 FindClass 没有找到类

java - JNI 函数调用 : CallVoidMethod 上的 ClassCastException

android - Android 中的 ODEX 文件是什么?

javascript - 单击按钮时获取单选按钮值不起作用angularjs

java - Android:无法创建泛型类

android - 为什么一个简单的应用程序中有这么多 GC_FOR_ALLOC?

android - Dalvik 字节码中的 "throws"和 "annotation for exception"

android - 如何在 Android 中使用图案/密码模式锁定/解锁屏幕?

java - 是否可以在 visual studio 中调试 JNI DLL?