3

我正在尝试制作一个使用一些 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_initjni_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) 发生,则应该终止前一个进程。

感谢并为所有的语法错误感到抱歉。

4

1 回答 1

2

这里

机器人:finishOnTaskLaunch

是否应该关闭活动的现有实例(完成)>每当用户再次启动其任务(在主屏幕上选择任务)时 - 如果 > 它应该关闭,则为“true”,如果应该关闭,则为“false”不是。默认值为“假”。

它明确指出,如果您希望您的活动只存在一次,您应该在 AndroidManifest.xml 中更改此值。

您还可以更改其他值,这将影响活动生命周期行为。

于 2013-01-03T14:03:43.750 回答