我使用最新Android NDK附带的新native_app_glue代码完全用C编写了一个Android应用程序。除了一件奇怪的事情外,一切正常。当我关闭我的应用程序并再次启动它时,我的.so共享对象崩溃了。我使用addr2line找出崩溃的函数,但它没有任何意义,因为它总是一个导致崩溃的不同函数,当然,它也是第一次正常工作。所以它必须是别的东西。
是否有人知道可能导致此行为的原因?正如我所说,行为是这样的:
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 :(得分:1)
当您尝试重新启动应用时,您的库可能仍然已加载。我知道两次加载相同的lib会导致崩溃。
我使用的解决方案与您加载lib的活动相同,使用第二个相同的loadlibrary覆盖OnDestroy。当活动结束时,这将使本机方崩溃(可能最好在启动器活动上加载您的库)。这样,当你重新启动应用程序时,你会有一个干净的名单。
答案 1 :(得分:0)
从您的转储中,似乎问题不在于任何native_app_glue调用中,而是在源代码中。
最初,如果它正在崩溃调用第三方函数,很可能,你的后面跟踪中至少会有一个libc.so引用,而是第一个引用是你自己的库。请你发布堆栈信息吗?没有看到源代码,我会打赌某种NULL指针引用。