android - 如何将 native 库加载到 native android 代码中? (安卓工作室)

标签 android c android-studio shared-libraries

我在文件夹中有一个名为 mylib 的 C 库 jniLibs/your_architecture/mylib.so

在 Java 中,要加载库,您只需在源代码中键入该代码:

static {
  System.loadLibrary("mylib");
}

但是如何在原生 C 代码中加载库(在 Android Studio 中)? 我补充说该库不使用 JNI 约定,它是一个普通的共享库。

最佳答案

如果这可以帮助某人,这里是如何在 native 代码 c/c++ 中加载库:

1 - 避免 java.lang.UnsatisfiedLinkError: dlopen failed: 将其添加到 build.gradle 到 android block 中:

sourceSets {
    main {
        jniLibs.srcDirs = ['src/main/jniLibs']
    }
}

假设你的lib文件在

src/main/jniLibs/{Architecture}/

( 取决于你的 jniLibs 文件夹在哪里,在我的例子中它位于 app/src/main/ 但大部分时间它在 app/)


2 - 在您的 CMakeList 中,通过添加以下 block 将您的库添加为SHAREDIMPORTED:

add_library(mylib SHARED
            IMPORTED
            )

3 - 通过添加以下 block 添加目标属性以定位您的 lib mylib.so:

set_target_properties( mylib PROPERTIES 
IMPORTED_LOCATION 
${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/mylib.so
)

我们在这里后退 (/../) 因为我们认为 CMakeLists.txt 在

src/main/cpp/

否则,大部分时间都在app/文件夹中,这种情况下,我们不需要后退。

所以在进入jniLibs/之前我们必须回到ma​​in/


4 - 添加你的库 mylib 到你的目标链接库:

target_link_libraries(native-library-jni
                      ..
                      ..
                      mylib
                      ..
                      ..
                      )


5 - 最后,要调用您的库 mylib.so 的方法,您必须创建/复制粘贴包含这些方法签名的 header 并将其包含在您的源文件中: #include "mylib.h"

您现在可以调用您的方法[namespace::]method(args...)


额外链接:

PROJECT_SOURCE_DIR

CMAKE_SOURCE_DIR

Q : Are CMAKE_SOURCE_DIR and PROJECT_SOURCE_DIR the same in CMake?

关于android - 如何将 native 库加载到 native android 代码中? (安卓工作室),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45314478/

相关文章:

android - Android Studio 中的编译错误在制作一个简单的 Google Android Maps API v2 项目时

java - 动画是抽象的,无法实例化

android - 如何在显示某个 fragment 时执行一段代码?

android - 日历类的使用

java - 在 java 中打包 C 二进制文件

android - 应用程序模块中引用的 android 库模块的“ Unresolved 引用”错误

android - 在哪里/如何设置 AlarmManager 警报以避免重复

c - 我在接受技术面试时被要求制作这样的结构..

c - 制作一个 C 程序,将 char 数组元素从一个数组复制到另一个数组,而不必担心空字符

java - 如何从 IntelliJ getter/setter 生成中删除 `get` 和 `set`