这个问题已在不同的地方提出,但似乎都没有给出简单详细的解释。
到目前为止,我已经构建了一个在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 ++代码时,或者它也应该在预构建时使用涉及图书馆和二进制文件。如果我在这种情况下需要它们,那么这些文件应该放在项目中吗?
我非常擅长安卓,请保持清醒和善意,谢谢分享你的一些智慧。
答案 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