C JNI库导致整个Android应用程序崩溃

5
我正在使用为Android编译的ffmpeg,目前效果还不错,但是有时会出现错误(基于某些Android手机配置),应用程序会显示以下消息并强制关闭:

Fatal signal 11 (SIGSEGV) at 0x00000001 (code=1), thread 20745 (AsyncTask #2)

ffmpeg调用位于try / catch内; 但似乎它并不在意。

所以,我该如何防止这种强制关闭,并向用户显示消息?

2个回答

1

很抱歉,我做不到。 还可以参考这个答案提示原因

当ffmpeg崩溃时,它会带走整个程序。这就是事情的本质。在Java编程中,您不必考虑程序以这种方式崩溃,但是当用C编写的ffmpeg崩溃时,它可能会使您的整个Java程序崩溃。

try/catch无法解决问题,因为ffmpeg不知道也不关心Java异常。在保持Java程序的同时,您唯一的解决方案是找到使ffmpeg崩溃的错误,或者找到触发错误的原因,并以不会崩溃的方式调用ffmpeg。正如Alex Cohn指出的那样,另一个解决方案是在另一个进程中运行ffmpeg,以便它不会破坏除自己进程之外的任何东西。


1
作为附注,我已经在远程服务中添加了FFmpeg调用,因此如果它崩溃,应用程序仍然可以运行,只有服务会停止。 - Alin
以及如何在另一个进程中调用它:https://github.com/IljaKosynkin/FFmpeg-Development-Kit/blob/master/JNI/app/jni/videokit.c#L41(这里是JNI,最好使用共享库,因为商业上不允许使用静态二进制文件)。 - user25

0

你可以将ffmpeg作为一个独立的可执行进程运行,而不是作为库。这样做可能会显著降低效率,但在这种设置下,你的进程可能会在ffmpeg崩溃时幸存。

你还可以设置你的应用程序,使其具有在单独进程中运行的Activity和Service,请参见例如如何创建使用单独进程的Android Activity和Service

这允许一些看门狗机制等。我无法在没有仔细测试的情况下确定这种方式是否比运行ffmpeg可执行文件更高效或更低效。


实际上,据我所知,在Android上无法使用fork(),因此您必须创建一个Android Service,但是我不确定当ffmpeg崩溃时会发生什么。您能使其自动重新启动吗? - Prof. Falken
当然,您可以随时重新启动服务,无论是自然停止还是由于某种崩溃。我从未在Android上尝试过fork(),但是Runtime.getRuntime().exec("/data/local/tmp/ffmpeg")从Java中运行得非常好。 - Alex Cohn
这里 提供了有关使用 Runtime.exec() 的详细说明。不,它不会阻塞,除非你添加调用 Process.waitFor() - Alex Cohn
这里有一个解释,如何轻松地将“命令行”可执行文件与APK捆绑在一起。 - Alex Cohn
顺便说一下,虽然我从未在Android上有机会使用fork(),但这个API是由NDK支持的。 - Alex Cohn
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接