在NDK中使用“exec()”

时间:2013-04-23 20:58:32

标签: android-ndk

我记得在某个地方读过使用" exec"在C代码中,由NDK编译。

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

1 个答案:

答案 0 :(得分:7)

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

我理解的理由只是Android框架无法正确管理应用的生命周期和生命周期,如果你去生成其他进程。

Exec

这里没有真正的替代选择,但是要避免启动其他可执行文件。这意味着您需要将可执行代码转换为直接链接到应用程序的库,并使用JNI从Java代码触发的普通NDK函数调用进行调用。

Fork

更难。如果你真的需要一个多进程模型,并希望符合规则的字母,你需要安排Android框架从Zygote进程中分离你。为此,您应该在另一个Service中运行所有后台代码,该AndroidManifest.xml声明在Service内的其他进程中运行。

为了达到极限,如果出于内存保护和隔离原因需要在不同进程中运行多个相同的代码实例,则可以执行Android Chrome所做的操作:

  • AndroidManifest.xml
  • 的子类中运行所有后台/分叉代码
  • 创建的多个子类
  • 将每个子类列为process中的一个单独服务,每个服务具有不同的startService属性
  • 在您的主要代码中,请准确记住您已激活的服务,并使用stopService / fork管理它们。

当然,如果您已将本机代码转换为库而不是可执行文件,则无论如何您可能不需要fork。使用fork的唯一原因是实现内存保护/隔离。

在实践中

在实践中,相当多的应用忽略了这一切,并直接在其原生代码中使用exec / {{1}}。目前,它至少可以用于短期任务。