在Android apk中打包linux二进制文件

在Android apk中打包linux二进制文件,android,android-ndk,ffmpeg,android-build,Android,Android Ndk,Ffmpeg,Android Build,如果我想在我的.apk文件中包含一个linux二进制文件(如ffmpeg)(仅适用于基于ARM的设备),这是否可以分发给非根手机?我知道可以使用Runtime.exec()调用包含的二进制文件,但这是推荐的做法吗 我认为如果没有根,就无法将它们标记为+x 使用ffmpeg,通常为libffmpeg创建JNI包装。您可以将二进制文件存储在res/raw或assets文件夹中。这样,它将部署在设备上。您应该在安装后“提取”它,您的/data/data/your.package/files/是一个有效

如果我想在我的.apk文件中包含一个linux二进制文件(如ffmpeg)(仅适用于基于ARM的设备),这是否可以分发给非根手机?我知道可以使用Runtime.exec()调用包含的二进制文件,但这是推荐的做法吗

我认为如果没有根,就无法将它们标记为+x


使用ffmpeg,通常为libffmpeg创建JNI包装。

您可以将二进制文件存储在
res/raw
assets
文件夹中。这样,它将部署在设备上。您应该在安装后“提取”它,您的
/data/data/your.package/files/
是一个有效的目的地<代码>/sdcard/不可用。您的应用程序无法访问通常的
/data/local/
目的地,即使它是用于adb外壳<代码>chmod 500也可以

这就是说,libffmpeg.so和JNI包装器更容易在Android应用程序中使用,并且占用更少的系统资源


更新,2014年4月您可以欺骗系统,将二进制文件存储在
libs/armeabi
文件夹中,并让安装程序为您提取此二进制文件。它将以
/data/data/your.package/lib/
文件夹结束,并具有
+x
权限。这种技术还有一个很好的优点,它允许系统选择正确的ABI来提取二进制文件:armeabiarmeabi-v7amips,或x86


诀窍是遵循共享库命名约定。因此,当您将ffmpeg可执行文件放入
libs/armeabi
中时,请将文件重命名为lib\u ffmpeg\uo.So。当然,您还将
Runtime.exec()
使用完整路径以及新添加的前缀和后缀创建文件。

这个项目似乎能够做到这一点,这就是为什么我提出了一个问题:从Android应用程序启动本机可执行文件是相当常见的,但您应该知道,Android架构师并不赞成这样做。他们不断威胁要在将来禁用该设施,因为他们无法像对主应用程序进程那样精确地管理这些进程的资源使用。谢谢@AlexCohn。您知道使用最新版本FFMPEG的FFMPEG JNI包装器吗?(最好是2.0以后的版本?。@StackOverflow:不,我不跟踪几十个ffmpeg包装和衍生产品。@JonesV是的,它是。我还没有在Android Pie设备上测试过这一点,但没有任何文件记录的变化会破坏这一功能。一个警告:不幸的是,这不适用于。