如何在本地Android代码中加载本地库?(Android Studio)

3

我有一个C语言库,名为mylib,位于文件夹jniLibs/your_architecture/mylib.so中。

在Java中,要加载这个库,只需在源代码中输入以下代码:

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

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


你找到解决方案了吗?我也需要在C中加载本地库。 - 3c71
1个回答

0
如果这能帮到某个人,以下是如何在本地代码c/c++中加载库的方法: 1 - 为了避免java.lang.UnsatisfiedLinkError: dlopen failed:,请将以下内容添加到build.gradle文件中的android块中:
sourceSets {
    main {
        jniLibs.srcDirs = ['src/main/jniLibs']
    }
}

假设您的库文件位于

src/main/jniLibs/{Architecture}/

(取决于您的 jniLibs 文件夹的位置,在我的情况下它位于 app/src/main/,但大多数情况它在 app/)。


2 - 在你的 CMakeList 中,将你的库添加为 SHAREDIMPORTED,方法是添加以下代码块:

add_library(mylib SHARED
            IMPORTED
            )

3 - 添加目标属性以定位您的库 mylib.so,方法是添加以下代码块:

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

我们在这里使用反斜杠 (/../) 是因为我们认为 CMakeLists.txt 文件位于

src/main/cpp/

否则,大多数情况下它位于 app/ 文件夹中,在这种情况下,我们不需要使用反斜杠。

因此,在进入 jniLibs/ 之前,我们必须返回到 main/


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

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


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

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


额外链接:

PROJECT_SOURCE_DIR

CMAKE_SOURCE_DIR

问:CMake 中 CMAKE_SOURCE_DIR 和 PROJECT_SOURCE_DIR 是相同的吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接