如何在Android应用程序中运行打包的二进制文件?

时间:2011-07-27 05:22:25

标签: android c android-ndk

我有一个Android应用程序,需要运行我写的自定义二进制应用程序。我已经使用ndk构建了二进制文件并将其打包在res / raw

下的apk中

我做了类似这样的事情来首先运行su进程。

Process process;
process = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(process.getOutputStream());

在此之后如何从资源运行二进制文件?这里还有另一个问题,建议使用AssetManager,但我不明白如何完成它。我查看了一些开源应用程序(android-wifi-tether等),这些应用程序包含了二进制文件,我没有在其源代码中看到AssetManager,也不明白他们究竟是如何做到的。

2 个答案:

答案 0 :(得分:3)

有一种令人讨厌的hacky方式来欺骗Android为你做这件事(我成功地做了)。

安装该应用程序后,Android会将libs/$ARCH/libfoo.so中适用于您的体系结构的相应库复制到/data/data/$PACKAGE/libs中。棘手的是它只会 复制lib$SOMETHING.so形式的文件。它甚至会保留执行权限。

因此,如果您将su可执行文件重命名为libsu.so,Android将为您完成所有工作。然后,您可以使用“活动”中提供的路径找到它。

但是,要小心! Android是未设计来运行独立应用程序,而Zygote实际上并没有很好地分叉。我发现Runtime.exec()有竞争条件,可能会崩溃。我发现唯一可靠的技术是使用JNI实现一个小型库,它可以执行fork和exec,而不会触及fork和exec之间的任何其他数据。我确实在这里有一个关于所有细节的问题,但我找不到它。

我现在无法访问任何代码,但如果您愿意,我可以在星期一为您找到一些代码。

答案 1 :(得分:2)

添加到David Given的响应,这很好,这是我在Android.mk结束时使用的自动重命名二进制文件。尝试同样的事情可能对其他人有用:

...
LOCAL_MODULE := yourbinarynamehere

include $(BUILD_EXECUTABLE)

all: $(LOCAL_MODULE)
    $(shell (mv libs/$(TARGET_ARCH_ABI)/$< libs/$(TARGET_ARCH_ABI)/lib$<.so))

在$之前注意TAB(shell ...空格不会按照标准GNU Make工作。