【问题标题】:C JNI library crashes the entire android appC JNI 库使整个 android 应用程序崩溃
【发布时间】:2014-10-02 12:45:20
【问题描述】:

我正在使用为 android 编译的 ffmpeg,现在可以正常工作,但是有时会出现错误(基于某些 android 手机配置),并且应用程序只是强制关闭并显示以下消息:

致命信号 11 (SIGSEGV) 位于 0x00000001(代码=1),线程 20745(AsyncTask #2)

ffmpeg 调用在 try/catch 中;但是,它似乎并不在意。

那么,如何防止这种强制关闭并向用户显示消息?

【问题讨论】:

    标签: android java-native-interface


    【解决方案1】:

    I'm afraid I can't do that. 另请参阅hints at why 的答案。

    当 ffmpeg 死亡时,它会带走你的整个程序。事情就是这样。使用 Java 编程时,您不必考虑程序会以这种方式崩溃,但是当使用 C 编写的 ffmpeg 死机时,它可能会导致您的整个 Java 程序崩溃。

    try/catch 没有帮助,因为 ffmpeg 不知道也不关心 Java 异常。留在 Java 程序中时,您唯一的解决方案是找到导致 ffmpeg 死亡的错误,或者找到触发错误的原因并以不会崩溃的方式调用 ffmpeg。正如 Alex Cohn 所指出的,另一种解决方案是在另一个进程中运行 ffmpeg,这样它就不能删除除自己的进程之外的任何其他内容。

    【讨论】:

    • 作为旁注,我在远程服务中添加了 ffmpeg 调用,因此如果它崩溃,应用程序仍然存在,只有服务死亡。
    • 以及如何在另一个进程中调用它:github.com/IljaKosynkin/FFmpeg-Development-Kit/blob/master/JNI/…(这里是 JNI,最好与共享库一起使用,因为不允许在商业中使用静态二进制文件)
    【解决方案2】:

    您可以不将 ffmpeg 作为库运行,而是作为单独的可执行进程运行。这可能会显着降低效率,但在这样的设置中,您的进程可能会在 ffmpeg 崩溃中幸存下来。

    您还可以设置您的应用,使其具有在不同进程中运行的 Activity 和 Service,例如,请参阅How to create an Android Activity and Service that use separate processes.

    这允许一些看门狗机制,等等。如果不仔细测试,我无法判断这种方式是否可以提供比运行 ffmpeg 可执行文件更好的性能,或者更糟。

    【讨论】:

    • 事实上,AFAIK,由于你不能在 Android 上fork(),你必须创建一个 Android 服务,但我不确定 ffmpeg 崩溃时会发生什么服务。能不能让它自动重启?
    • 当然,您始终可以重新启动服务,无论它是自然停止还是由于某些崩溃而停止。我从来没有在 Android 上尝试过 fork(),但 Runtime. getRuntime().exec("/data/local/tmp/ffmpeg") 在 Java 上的效果很好。
    • 你的意思是你会像那样将 ffmpeg 二进制文件捆绑到你的 Android 应用程序中?有趣的。这是否是一个明智的解决方案取决于 ffmpeg 的使用方式。它是否用于从 API 流式传输? exec() 是否阻塞?等等……
    • Here 是关于使用 Runtime.exec() 的详细说明。不,除非您将呼叫添加到 Process.waitFor(),否则它不会阻止。
    • Here 解释了如何轻松地将“命令行”可执行文件与 APK 捆绑在一起。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    • 2016-11-20
    相关资源
    最近更新 更多