4

我记得在某处读过,不建议在 NDK 编译的 C 代码中使用“exec”。

推荐的方法是什么?我们是否尝试将 EXEC 代码推送到 Java 空间?也就是说,JNI(或应用程序)会产生新进程,(并且在相关的地方将结果传递回 NDK)?

4

1 回答 1

11

首先,不建议使用forkexec。您的所有代码通常都应该存在于一个进程中,该进程是您的主要 Android 应用程序进程,由 Android 框架管理。任何其他进程都可能随时被系统杀死(尽管据我所知,实际上这在当前的 Android 版本中不会发生)。

据我了解,原因很简单,如果您要生成其他进程,Android 框架无法正确管理您的应用程序的生命周期和生命周期。

Exec

您在这里别无选择,只能避免启动其他可执行文件。这意味着您需要将可执行代码转换为直接链接到应用程序的库,并使用正常的 NDK 函数调用进行调用,由 Java 代码中的 JNI 触发。

Fork

比较困难。如果你真的需要一个多进程模型,并且想要符合规则,你需要安排 Android 框架从它的 Zygote 进程中分叉你。为此,您应该以不同的方式运行所有后台代码,该代码Service被声明为在AndroidManifest.xml.

将这一点发挥到极致,如果出于内存保护和隔离原因,您需要在不同进程中运行多个相同的代码实例,您可以执行 Android Chrome 所做的操作:

  • 在子类中运行所有背景/分叉代码Service
  • 创建多个子
  • AndroidManifest.xml将这些子类中的每一个列为具有不同process属性的每个子类中的单独服务
  • 在您的主代码中,准确记住您已启动和未启动的服务,并使用startService/管理它们stopService

当然,如果您已经将本机代码变成了库而不是可执行文件,那么您可能就不需要fork了。唯一剩下的使用理由fork是实现内存保护/隔离。

在实践中

在实践中,很多应用程序忽略了所有这些并直接在其本机代码中使用fork/ 。exec目前,它至少适用于短期任务。

于 2013-04-23T21:45:44.487 回答