在使用NDK将近一年之后,我开始意识到Android中的进程生命周期与活动生命周期是不同的。
更具体地说,我的本地库是在OnCreate中加载的,但在onDestroy中没有卸载(我甚至不知道在这里是否可以卸载本机库),但在下一个OnCreate中,它仍然是相同的进程,因此我的本机库中的所有全局变量仍然有效,并保留了它们的状态。Java中的静态变量也是如此。
这在Android2.3上是很好的,但是我最近使用了Android4.2.2,我注意到一些非常奇怪的事情。现在可以终止进程而只调用onRestart() (或者这是我从阅读日志中假设的),说实话这有点奇怪,因为我假设onCreate会在进程实例化之后立即被调用,但他保留了一个不同的标签,因为他考虑的是“活动”而不是流程。所以基本上,如果我暂停我的一个应用程序很长一段时间(比如说1+小时),然后我回到它,它通常会导致崩溃。
设备日志摘录:
04-14 04:41:34.886 2376 2376 I am_on_paused_called: [0,com.re3.benchmark.AboutActivity]
04-14 05:06:26.128 386 594 I am_proc_died: [0,2376,com.re3.benchmark]
04-14 13:19:44.256 386 538 I am_proc_start:[0,4761,10062,com.re3.benchmark,activity,com.re3.benchmark/.AboutActivity]
04-14 13:19:44.295 386 595 I am_proc_bound: [0,4761,com.re3.benchmark]
04-14 13:19:44.397 386 595 I configuration_changed: 5248
04-14 13:19:44.459 386 595 I am_restart_activity: [0,1115347592,8,com.re3.benchmark/.AboutActivity]
04-14 13:19:44.701 4761 4761 I am_on_resume_called: [0,com.re3.benchmark.AboutActivity]
04-14 13:19:44.881 386 401 I am_activity_launch_time: [0,1115347592,com.re3.benchmark/.AboutActivity,631,631]
04-14 13:19:52.725 386 595 I am_crash: [4761,0,com.re3.benchmark,8961606,java.lang.NullPointerException,NULL,REFramework.java,330]
04-14 13:19:52.725 386 595 I am_finish_activity: [0,1115347592,8,com.re3.benchmark/.AboutActivity,crashed]
04-14 13:19:52.772 386 595 I am_pause_activity: [0,1115347592,com.re3.benchmark/.AboutActivity]PS:我确实意识到崩溃源于我的代码,但我的代码并没有真正处理作为整个过程中第一个被调用的函数的onRestart (就像在中一样,它绕过了我的本地库初始化,因为我希望onCreate首先被调用)。
发布于 2013-04-15 04:01:05
您可能应该在Application.onCreate中而不是在Activity中加载本地库。
如果您有多个Activity,则只创建当前可见的库,如果您在第一个Activity中加载库,则此时不会加载它。
https://stackoverflow.com/questions/16003433
复制相似问题