13

我想将 Android 本机命令行应用程序打包到 apk 中。我有使用 jni/Android.mk 的 ndk-build 构建应用程序。输出在 libs/armeabi/<MyApp> 中。我也有 ant 的 apk 建设。但是,apk 似乎没有选择命令行应用程序。如果我解压缩apk,则该应用程序不在其中。

我需要做什么才能让 ant 包含预构建的命令行应用程序?

另外,我需要做什么才能让 ant 运行 ndk-build?(这已经回答了:Android NDK build with ANT script

4

2 回答 2

13

请参阅使用 ANT 脚本构建 Android NDK

aapt如果 Ant 不自动复制二进制文件,您可以将二进制文件添加到 APK libs/armeabi,请参阅Ant 脚本中 aapt 元素的文档

我相信该文件将被正确提取到/data/data/your.package.full.name/lib具有可执行权限的 .

Ant 构建涉及一个称为“ ApkBuilder ”的步骤,它仅添加来自libs/armeabi该匹配模式的文件,^.+\.so$或者gdbserver- 后者仅用于调试构建。

但是将可执行文件重命名为“myexecutable.so”是不够的:设备上的 APK 安装程序不会提取此文件。

将可执行文件重命名为lib myexecutable .so就足够了:该文件将由设备上的APK 安装程序包管理器解压缩为/data/data/your.package.full.name/lib,并具有可执行权限。

我个人喜欢给这个不是真正的图书馆一些特殊的名字,例如lib...ffmpeg...so

UPDATE 6 年和 12 个 API 级别后,这种方法仍然有效。但是对于 Android App Bundle,包管理器的默认行为不是从 APK 中提取本机库,而是就地使用它们。在此处以及对此答案的评论中,您会找到一些解决方法。一个特别吸引人的是将可执行文件称为"/path/to/MyApp.apk!lib...ffmpeg...so",但我没有测试过这种表示法不适用于System.exec()。请参阅IssueTracker进行讨论。

请注意,现在wrap.sh有一个特殊例外

于 2013-06-29T21:01:58.280 回答
2

通常,您应该将命令行应用程序放入Assets文件夹,然后使用AssetManager以提取您的资产(chmod提取后不要忘记它!)。但是将其解压到哪里会有问题,因为并非Android中的每个目录都可以存储可执行的二进制文件。在 Android 2.2 上,我尝试过/cache并且可以正常工作。不能说新的安卓。抱歉,无法提供有关 ant 的建议。

于 2013-06-29T20:16:00.633 回答