android - 导入现有的 c++ 库(.a 或 .so 文件)ndk android

标签 android android-ndk java-native-interface .a .so

我刚刚完成了 android 的原生开发。我成功地让我的 AndroidStudio 2.2.2 准备好进行原生开发

我还构建了示例 hello-jni 项目

我正在努力实现的目标

我正在尝试使用用 c++ 设计的现有库(我将获得静态库 .a 扩展名或 .so 文件)

关于原生开发的一些困惑

1) 我应该使用现有 c++ 库的 .cpp 和 .h 文件而不是 .a.so 文件吗?

2) 我需要制作 CMakeLists.text 吗:据我搜索,我的 .a 文件 不是使用 ndk-build 生成的> ,所以我需要做到这一点。

如果我使用 .cpp 和 .h 文件 ,我应该制作 Android.mkApplication.mk

CMakeLists.text 将我新开发的 android 项目编译为库还是我现有的 .a 文件?

3) 我应该把.a 文件放在我项目的什么地方。它在 jni 文件夹下吗?

4) 我的 java 类文件是否应该使用 关键字 native 定义方法,就像在 c++ 文件中实现的一样(示例:在 c++ 文件方法名称 getData() 中,java 类是否应该包含 public native getData( ) )

最佳答案

注意:此答案并未说明在编写 native (C++) 代码后如何使用 CMake。对于该设置,请阅读下面的答案以全面了解该设置,然后查看 this answer .


好的,您有很多问题。其中一些问题属于个人偏好类型,但我会根据个人选择提供它们。

#1 这是你的选择。我个人会使用编译后的 .so 文件。这样我就永远不必担心 NDK 和 CMake 以及 .mk 文件。如果你有这个文件,你所要做的就是将文件添加到 libs 文件夹(而不是 lib 文件夹)并对你的 build. gradle 文件。就是这样。

更改为 build.gradle:

sourceSets {
    main {
        manifest.srcFile 'AndroidManifest.xml'
        java.srcDirs = ['src']
        res.srcDirs = ['res']
        assets.srcDirs = ['assets']
        jniLibs.srcDirs = ['libs']
    }
}

#2 & 3 这些与此选项无关。

#4 无论您使用文件还是编译的库,您都必须这样做:

@SuppressWarnings("JniMissingFunction")
public class MyNativeMethods {
    static {
        System.loadLibrary("my_native_lib");
    }

    public native int native_method_1(int fd);
    public native int native_method_2(int fd);
    public native void native_method_3(int fd, int arr[]);
    public native int[] native_method_4(int fd);
}

然后,您可以从您的 Activity/Fragment 调用这些方法。

希望这已经足够清楚了。


编辑(基于以下评论):

  1. .so.a 文件是您的原生库。

  2. .cpp.c 等文件只是您的 native 源代码文件。如果要在项目中使用这些文件,则必须使用构建系统(例如 CMake)来使用它们。 CMake 会获取您的源代码文件并制作一个 .so 库,这又是 native 库。这就是为什么我建议使用 .so 文件的原因,因为为什么在不需要时在项目中执行 CMake 的工作?

如果以后想尝试或学习CMake,请查看此答案:C/C++ with Android Studio version 2.2

  1. System.loadLibrary("my_native_lib");:在这里您告诉 Java 运行时添加这个给定的库。通过这种方式,您可以在 Java 和库中的 C++ 代码之间创建链接。该行下面的方法的名称应与它们在 C++/C 代码中的名称相同。这样 Java 运行时将找到并打开库并在您加载的库中查找那些方法。查看更多here

关于android - 导入现有的 c++ 库(.a 或 .so 文件)ndk android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40415510/

相关文章:

Android 使用 native 库时出现 UnsatisfiedLinkError

android - 适用于 Android NDK JNI 游戏的 SDL 中的倾斜控制

java - 使用 ColorMatrixColorFilter 的图像过滤器

java - 在电子邮件android的邮件正文中发送图像

android-ndk - LOCAL_CFLAGS -mno-thumb 是什么意思?

android - 如何通过 Ndk-build 静态构建可执行文件?

java - 动态链接库和Java

android - 按钮没有出现在 android appwidget 布局中

android - 当我第 22 次尝试生成音调时出现未初始化的 AudioTrack 异常

opengl-es - 当我在 NDK 程序中使用 Eglimage 替换 glreadpixels 时出现什么问题?