android - 如何从android studio链接和调用预构建静态 native 库的功能

标签 android c++ ffmpeg android-ndk mp4parser

我需要更改音频的音高和时间拉伸(stretch)。为此,我正在使用预构建静态库。目前我有 libZtxAndroid.a 静态库和包含函数声明的相应头文件。但我不知道如何在我的 android studio 应用程序中加载这个库并从 java 代码调用 native 函数。我探索了许多链接并尝试加载这个库。但是所有的尝试都失败了。这是我上次试过的一个链接https://tariqzubairy.wordpress.com/2012/03/12/use-of-prebuild-static-library-compiled-with-android-toolchain/

我还在这个应用程序中使用 FFMPEG 共享库和 MP4Parser ( https://github.com/sannies/mp4parser ) 库分别为视频添加水印和合并音频。任何人都可以从基础上提供帮助。

  1. 如何加载静态库?
  2. 我需要在哪里放置静态库?
  3. 我需要在哪里创建 jni 文件夹(文件夹结构)?
  4. 如何在 java 代码的头文件的帮助下调用该静态库中可用的函数?

最佳答案

你需要做几件事:

  1. 编译动态 库。这是 Android 中的 .so 文件。 您可以使用 android ndk 执行此操作。
  2. 在每个 android 项目中都有一个目录,我是从头顶说的,但我认为它在一个 jni 子目录中,您必须将您的库放在该目录中。
  3. 您应该用 JNI 包装您的库。将它们作为其他问题的建议:JNI folder in Android Studio
  4. 如果你在 android 中有这样的东西:

    Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* 环境, 工作主题 )

其中 Java_comp_example_hellojni_HelloJni 是您的项目名称,您必须从 Java 执行,假设您的库名称是 libmylib.so:

public class HelloJni {
  static {
    System.LoadLibrary('mylib');
  }

  public native stringFromJni();
}

请注意, native 库名称不需要 lib 前缀和 .so 后缀。另请注意,您不需要任何来自 C++ 的头文件,您只需从 Java 加载库并声明一个 native 函数。在 Java 项目使用它之前,该库应该已经编译并位于正确的目录中。

加载时要小心:如果您使用标准库的共享版本,您还需要将它添加到 Java 中的 static { 部分以加载它,在您的库之前。

关于android - 如何从android studio链接和调用预构建静态 native 库的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41800007/

相关文章:

c++ - 从字符串数据类型的字符串中分离元音并将其存储在新字符串中

c++ - 尝试将二维数组作为参数传递时 undefined reference

ffmpeg 文件转换不可读

vb6 - 帮助 ffmpeg

python - 合并音频和视频ffmpeg-python时出错

java - urlConnection.getInputStream() 抛出 EOFException

java - 以编程方式设置 TextView 的边距

c++ - 将 const void* 转换为 const int*

android - 如何让我的 AIR (flash as3) 应用程序在 Android 上全屏显示?

android - 如何添加 Firebase 对象/节点+子树修改时的时间戳?