2011-06-04 46 views
1

我已經使用最新的Android NDK附帶的新native_app_glue代碼完全在C中編寫了一個Android應用程序。除了一件奇怪的事情之外,它一切正常。當我關閉我的應用程序並重新啓動時,我的.so共享對象崩潰了。我使用addr2line來查找崩潰的函數,但它沒有任何意義,因爲它總是一個不同的函數導致崩潰,當然,它也是第一次運行正常。所以它一定是別的。我的Android應用程序奇怪的崩潰

有沒有人有一個想法可能會導致這種行爲?正如我所說的,行爲是這樣的:

1)第一次開始 - >應用始終正常工作 2)第二次啓動 - >應用程序崩潰 3)第三次開始 - >程序再次工作正常 4)第四次啓動 - >應用程序再次崩潰 5)第五次啓動 - >再次正常工作 6)第六次 - >崩潰 等等等等。

我不知道那裏有什麼問題。也許我的應用沒有正確關閉?但我得到並處理兩個術語消息(APP_CMD_TERM_WINDOW和APP_CMD_DESTROY)。我真的沒有線索有什麼不對...

感謝您的幫助!

編輯:這裏的崩潰日誌:

I/DEBUG ( 31): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 
I/DEBUG ( 31): Build fingerprint: 'generic/sdk/generic:2.3.1/GSI11/93351:eng/test-keys' 
I/DEBUG ( 31): pid: 1105, tid: 1114 >>> com.example.testapp <<< 
I/DEBUG ( 31): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000058 
I/DEBUG ( 31): r0 8382746d r1 00000000 r2 00000058 r3 00000058 
I/DEBUG ( 31): r4 00000000 r5 8382746d r6 00242920 r7 00000554 
I/DEBUG ( 31): r8 00245150 r9 001ec8e0 10 839651dc fp 00000000 
I/DEBUG ( 31): ip 839654e0 sp 435fc2b0 lr 8381c78f pc 83861858 cpsr 00000030 
I/DEBUG ( 31):   #00 pc 00061858 /data/data/com.example.testapp/lib/libtestapp.so 
I/DEBUG ( 31):   #01 pc 0001c78a /data/data/com.example.testapp/lib/libtestapp.so 
I/DEBUG ( 31):   #02 pc 0001d7d4 /data/data/com.example.testapp/lib/libtestapp.so 
I/DEBUG ( 31):   #03 pc 000ab1fa /data/data/com.example.testapp/lib/libtestapp.so 
I/DEBUG ( 31):   #04 pc 000fc9e2 /data/data/com.example.testapp/lib/libtestapp.so 
I/DEBUG ( 31):   #05 pc 00011a7c /system/lib/libc.so 
I/DEBUG ( 31):   #06 pc 00011640 /system/lib/libc.so 
+0

你可以發佈代碼片段與logcat – Sumant 2011-06-04 15:53:17

+0

@Sumant:在這裏你去 – andy 2011-06-04 16:40:40

+0

最有可能你正在使用靜態的方式應該是非靜態的東西(即掛在它的過程上下文),和當您不恰當地重新使用它時,在重新使用現有進程的重新啓動過程中,您會嘗試訪問不再有效的東西而崩潰。 – 2012-06-27 20:19:30

回答

1

這可能是因爲當您嘗試重新啓動您的應用程序庫中仍然加載。我知道兩次加載相同的庫會導致崩潰。

與我一起去的解決方案與加載lib的活動相同,使用第二個相同的loadlibrary覆蓋OnDestroy。這會在活動結束時使本機崩潰(可能最好將您的庫加載到啓動器活動中)。這樣,當你重新啓動你的應用程序時,你將擁有一個乾淨的平板。

+0

您正在考慮傳統的java-invoking-jni,但是這個問題涉及沒有開發人員編寫的Java組件的本地活動。另外,加載一個已經加載的庫不會導致崩潰。 – 2012-06-27 20:16:09

0

從您的轉儲似乎問題不是在任何native_app_glue調用,但在您的源代碼。

最初,如果它正在調用第三方函數,最有可能的是,至少在後臺跟蹤中至少有一個libc.so引用,而第一個引用是您自己的庫。你可以發佈堆棧信息嗎?沒有看到源代碼,我會下注某種空指針引用。