我正在尝试制作一个使用一些 jni 代码的 android 应用程序。
这个 jni 代码分配了一些内存,这些内存必须被释放。假设
我有这个包含这段代码的类:
class MyJniClass{
public native void jni_init(); //this allocates some memory
public native void do_something(); //this also allocates some memory,
which is linked to the memory allocated in jni_init()
public native void jni_destroy(); //this frees all the allocated
memory in two previous functions
... // some other java code
}
我的麻烦是,在活动生命周期的哪个位置调用jni_init
和jni_destroy
. 所以我开始研究活动生命周期的工作原理,我对结果有点困惑。我想这是由于我试图
深入了解 linux 进程级别的事实造成的。但是我使用的是jni,所以它是有道理的。
我创建了一个简单的活动,实现了所有生命周期回调并将一些日志记录到其中。我对构造函数做了同样的事情,我还添加了 jni 代码,它记录pid
了进程。
所以,我发现 - 即使没有调用 onDestroy,活动也可以被销毁(这很清楚,我为此找到了很多解释)并且该过程仍在运行(通过使用时间线、ps 命令和 getpid jni 等应用程序进行验证称呼)。该进程正在运行,因此保持分配的内存似乎是合乎逻辑的。
问题是,在哪里分配内存。我不能使用onCreate
,因为它可以在进程生命周期内多次调用,因此可能会发生内存泄漏。我也不想使用 onStart 进行分配和使用 onStop 进行释放,因为这是不必要的工作。我尝试了单例设计,它似乎可以工作,但我不想使用它,因为我需要 MyJniClass 是可重入的(我也想在服务中使用它)。所以我的问题是 - 是否有一些推荐的方法如何在 jni 应用程序中进行内存管理?
编辑:我看到我没有足够清楚地描述这其中最令人困惑的部分。以下是事件的顺序:
1)我使用启动器中的图标启动应用程序
2)新活动被创建(构造)
3) onCreate 被调用
4) onStart 被调用
5) onResume 被调用
6)我按下主页按钮
7) onSaveInstanceState 被调用
8) onPause 被调用
9) onStop 被调用
10) 我使用启动器中的图标启动应用程序(如步骤 1 所示)
11) 新活动被创建(构造)
12) onCreate 被调用
13) onStart 被调用
14) onResume 被调用
令人困惑的步骤是 11) 和 12),因为进程 (pid) 仍然相同,但正如我从文档中了解到的那样,如果 11) 和 12) 发生,则应该终止前一个进程。
感谢并为所有的语法错误感到抱歉。