2

这个问题已经在不同的地方提出,但似乎没有一个简单的详细解释需要什么。

到目前为止,我已经构建了一个用于 android 的原生二进制 ffmpeg,构建还可以。

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

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

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

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

然后还有 Android.mk 和 Application.mk 文件的问题,什么时候需要它们,是仅在尝试在 android 中构建本机 C/C++ 代码时,还是应该在预构建库和二进制文件时使用参与其中。而且,如果我在这种情况下需要它们,这些文件应该放在项目中的什么位置?

我对android很陌生,请保持清晰和谨慎,感谢您分享您的一些智慧。

4

1 回答 1

0

我可以给你一些链接:

如何在使用JNI
将.h文件包含到android中的java文件中时使用外部C/C++库文件,使用jni作为.h文件的源文件夹?
Android NDK 中的多个(我的和第 3 方)本机库
Android NDK - 使两个本机共享库相互调用

首先,你想如何调用原生代码?

您有 2 个选项:

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

2)您可以调用shell命令。Android 是 Linux,您可以通过adb shell. 您可以传递命令行参数,向/从已启动进程的标准输入/标准输出写入/读取。您还可以通过文件系统将数据传入/传出已启动的进程。例如,这是su在有根设备上使用的方法: 从 android 执行 shell 命令

于 2014-11-26T08:42:27.337 回答