在Android应用程序中使用预构建的本机二进制文件

时间:2014-11-26 08:12:17

标签: android android-ndk java-native-interface android-shell

这个问题已在不同的地方提出,但似乎都没有给出简单详细的解释。

到目前为止,我已经构建了一个在android中使用的本机二进制文件ffmpeg,构建正常。

我已将二进制文件放在我的项目/ lib / armeabi-v7a /目录中,并将其重命名为libffmpeg.so,以便包装系统可以将其添加到其他帖子中。

现在的问题是libffmpeg.so或ffmpeg需要一些其他库,这些库通常位于其(ffmpeg)自己的lib目录中。当我使用Runtime.getRuntime()。exec(命令)运行它时,它会调用那些不在正确位置或者根本没有被android打包系统拾取的其他库。

所以我将ffmpeg所需的所有库复制到同一个/ lib / armeabi-v7a /但仍然没有成功。

在Stackoverflow中搜索,我发现使用jni aproach的帖子和其他人说他们可以在没有jni的情况下完成。在android中使用需要其他库的预构建二进制文件的最简单方法是什么?

然后还有Android.mk和Application.mk文件的问题,什么时候需要,只有当一个人试图在android中构建本机C / C ++代码时,或者它也应该在预构建时使用涉及图书馆和二进制文件。如果我在这种情况下需要它们,那么这些文件应该放在项目中吗?

我非常擅长安卓,请保持清醒和善意,谢谢分享你的一些智慧。

1 个答案:

答案 0 :(得分:0)

我可以给你一些链接:

How to use external C/C++ library file while working with JNI
include .h file into java file in android using jni as source folder of .h file?
multiple (my and 3rd-party) native libraries in Android NDK
Android NDK - make two native shared libraries calling each other

首先,您想如何调用本机代码?

您有两个选择:

1)通过包装器调用库函数:一个定义了一组本机函数的类。您将不得不在Java表示和C表示之间转换数据结构。 Java对象映射到非常特定的C数据结构,并且通常无法从Java访问C结构。因此,对于每个调用的C / C ++函数,都有一个实现Java本机函数的包装器。

2)您可以调用shell命令。 Android是Linux,您可以通过adb shell与之通信。您可以传递命令行参数,对已启动进程的stdin / stdout进行写入/读取。您还可以通过文件系统将数据传入/传出已启动的进程。例如,这是在root设备上使用su的方法: execute shell command from android