【问题标题】:How to load native library into native android code? (AndroidStudio)如何将本机库加载到本机 android 代码中? (安卓工作室)
【发布时间】:2017-07-25 22:24:12
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: android c android-studio shared-libraries


    【解决方案1】:

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

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

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

    假设你的 lib 文件在

    src/main/jniLibs/{架构}/

    (取决于您的jniLibs 文件夹在哪里,在我的情况下,它位于app/src/main/,但大部分时间位于app/


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

    add_library(mylib SHARED
                IMPORTED
                )
    

    3 - 通过添加以下块添加目标属性以定位您的 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 - 将您的 lib mylib 添加到您的目标链接库:

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


    5 - 最后,要调用 lib mylib.so 的方法,您必须创建/复制包含这些方法签名的标头并将其包含在源文件中: #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?

    【讨论】:

      猜你喜欢
      • 2015-03-24
      • 2014-10-03
      • 1970-01-01
      • 2017-02-25
      • 1970-01-01
      • 2015-11-01
      • 2022-01-07
      • 2012-08-01
      • 1970-01-01
      相关资源
      最近更新 更多