2013-01-09 34 views
1

隨着JNI,我正在創建一個來自工作項目的弱全球參考。後來,當試圖訪問這個參考時,dalvik vm在Android 2.3上崩潰,但在4.1和4.2上崩潰。我發現,IsSameObject具有對象本身,並且創建的弱引用作爲參數在工作設備上返回1,在其崩潰的設備上返回0。那有意義嗎?更改爲GlobalRef和IsSameObject返回1.Android 2.3不能正常工作的弱全局參考(JNI)

這裏我在創建弱全局引用之後立即測試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 

我需要提取的參考對象?或者我應該完全避免虛弱的引用?

回答

4

如果我把弱引用放在NewLocalRef中,它似乎很好。 所以我結束了:

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

而現在的成員變量是jMyWeakObject。

+2

感謝您的提示!如果你有興趣知道*爲什麼*這個解決方案有效,這是解釋[這裏](http://developer.android.com/training/articles/perf-jni.html#unsupported) – mbrenon

+0

是的,我真的發現,天后來。很高興在這裏發佈。 – pakerfeldt