我记得在某处读过,不建议在 NDK 编译的 C 代码中使用“exec”。
推荐的方法是什么?我们是否尝试将 EXEC 代码推送到 Java 空间?也就是说,JNI(或应用程序)会产生新进程,(并且在相关的地方将结果传递回 NDK)?
我记得在某处读过,不建议在 NDK 编译的 C 代码中使用“exec”。
推荐的方法是什么?我们是否尝试将 EXEC 代码推送到 Java 空间?也就是说,JNI(或应用程序)会产生新进程,(并且在相关的地方将结果传递回 NDK)?
首先,不建议使用fork
或exec
。您的所有代码通常都应该存在于一个进程中,该进程是您的主要 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
目前,它至少适用于短期任务。