在Android上杀死长时间运行的本机代码

在Android上杀死长时间运行的本机代码,第1张

概述当用户按下“取消”按钮时,如何在不插入取消检查的情况下立即放弃使用Android中本机代码(以C语言编写)的长期运行?解释约束:>该本机代码太复杂,无法插入足够的取消检查或进度信息[1],因此必须强行终止该过程.>Android应用程序的UI必须保持运行(因此需要一个单独的过程),以使用户

当用户按下“取消”按钮时,如何在不插入取消检查的情况下立即放弃使用Android中本机代码(以C语言编写)的长期运行?

解释约束:

>该本机代码太复杂,无法插入足够的取消检查或进度信息[1],因此必须强行终止该过程.
> AndroID应用程序的UI必须保持运行(因此需要一个单独的过程),以使用户可以方便地使用不同的参数重试.@H_301_6@>一次无需支持多个这样的计算.

我很清楚,AndroID上流程生命周期的总体立场是必须让平台为您管理它.尽管如此,我希望通过尽可能少的不受支持的 *** 作来尽可能接近上述要求.

我在下面有一个解决方案,但我希望有更好的解决方案.例如,如果您在< service>上使用android:process attribute将服务拆分为一个额外的进程,并且其中一个线程进入了深层的JNI调用,则有一种方法可以立即终止此类进程或从内部退出该进程,而不会导致运行时将其视为意外崩溃?

[1]我尝试过取消检查.超过70,000 SLOC(3.1 MB)的C语言,其内存分配和控制流非常复杂.它在编写时并未考虑中断性.这样就存在double-free()和后续 *** 作中难以理解的崩溃.

解决方法:

这是我目前正在做的事情:

>在build.gradle中:编译仅本机可执行文件,就好像命令行调用一样.

>搜寻其他这样做的魔术词是ndk “BUILD_EXECUTABLE”.@H_301_6@>必须说出它是库的名称,才能说服构建工具将其包括在内,并在设备上安装软件包安装程序以解压缩它.@H_301_6@>这在Android Studio Preview NDK support中尚无法实现,我真的希望最终版本能够以某种round回的方式将这扇门敞开.

>当starting the process时,将其复制到我可以对其进行chmod x的路径,然后执行Runtime.exec()(我仅需要stdout的< 1KB).@H_301_6@>要停止该过程,只需对其调用.destroy().

这是否受支持值得怀疑:NDK文档讨论了you can build an executable but it won’t get installed的运行方式.但是,从经验上讲,它与主流AndroID设备至少在v2.1-5.1之间具有广泛的兼容性.它被部署在widely-used app中(100,000个下载,〜47,000个活动状态).

可能在上述二进制安装过程中失败的环境包括:

> App Runtime for Chrome@H_301_6@> Blackberry

总结

以上是内存溢出为你收集整理的在Android上杀死长时间运行的本机代码全部内容,希望文章能够帮你解决在Android上杀死长时间运行的本机代码所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1079714.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存