使用NDK近一年之后,我逐渐意识到Android中的Process生命周期与Activity生命周期不同。
更具体地说,我的本机库正在OnCreate中加载,但在onDestroy中它没有被卸载(我甚至不知道你是否可以在这里卸载本机库),但在下一个OnCreate中,它仍然是相同的进程,所以来自我的本机库的所有全局变量仍然存活,并保留其状态。对于Java中的静态变量也是如此。
这对于Android 2.3来说非常好,但我最近进入了Android 4.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到先被称为。)
答案 0 :(得分:1)
您可能应该在Application.onCreate
而不是Activity
中加载本机库。
如果您有多个Activity
,则只会创建当前可见的内容,如果您在第一个Activity
中加载了lib,则此时不会加载它。