首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在Android Studio中使用预建的共享库(cmake)

在Android Studio中使用预建的共享库(cmake)
EN

Stack Overflow用户
提问于 2017-11-09 12:59:41
回答 4查看 8.5K关注 0票数 10

我想在我的安卓应用中使用C++共享库。我尝试按照谷歌的NDK示例中的hello-libs示例进行操作,但不知何故没有成功。

看起来,我的库并没有打包到APK中。我找到的所有教程都在使用*.mk-files,但我想使用cmake

这是我的CMakeLists.txt:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Sets the minimum version of CMake required to build the native library.
cmake_minimum_required(VERSION 3.4.1)

# native lib
add_library(native-lib SHARED
            native-lib.cpp)

set(IMPORT_DIR ${CMAKE_SOURCE_DIR}/../jniLibs)

# shared lib
add_library(shared-lib SHARED IMPORTED)
set_target_properties(shared-lib PROPERTIES IMPORTED_LOCATION
                      ${IMPORT_DIR}/dynamic/lib/${ANDROID_ABI}/libLibrary.so)
target_include_directories(native-lib PRIVATE
                           ${IMPORT_DIR}/dynamic/include)

# linking libs
target_link_libraries(native-lib
                      android
                      shared-lib
                      log)

只要我将shared-lib与其他链接在一起,我就会在运行应用程序时得到以下错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
E/art: dlopen("/data/app/my.package.name-1/lib/arm/libnative-lib.so", RTLD_LAZY) failed: dlopen failed: library "C:/projects/HelloLibs/app/src/main/cpp/../jniLibs/dynamic/lib/armeabi-v7a/libLibrary.so" not foun
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: my.package.name, PID: 29266
                  java.lang.UnsatisfiedLinkError: dlopen failed: library "C:/projects/HelloLibs/app/src/main/cpp/../jniLibs/dynamic/lib/armeabi-v7a/libLibrary.so" not found
                      at java.lang.Runtime.loadLibrary(Runtime.java:371)
                      at java.lang.System.loadLibrary(System.java:988)
                      at my.package.name.MainActivity.<clinit>(MainActivity.java:11)
                      at java.lang.reflect.Constructor.newInstance(Native Method)
                      at java.lang.Class.newInstance(Class.java:1690)
                      at android.app.Instrumentation.newActivity(Instrumentation.java:1078)
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2543)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2771)
                      at android.app.ActivityThread.access$900(ActivityThread.java:177)
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1432)
                      at android.os.Handler.dispatchMessage(Handler.java:102)
                      at android.os.Looper.loop(Looper.java:135)
                      at android.app.ActivityThread.main(ActivityThread.java:5912)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at java.lang.reflect.Method.invoke(Method.java:372)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200)

看起来在设备上找不到库。否则,看起来库的路径仍然是我本地的maschine上的路径。

EN

回答 4

Stack Overflow用户

发布于 2017-11-09 21:55:32

预构建的libLibrary.so没有SONAME。如果由于某种原因不能用最新的NDK重新构建这个库,您可以尝试使用patchelf实用程序将SONAME添加到现有的二进制文件中。

票数 4
EN

Stack Overflow用户

发布于 2019-01-26 14:00:08

要将预构建库打包到APK中,需要使用sourceSets块手动配置Gradle,使其包含.so文件的路径。在构建APK之后,您可以使用APK分析器(Build>Analyze APK...)验证哪些库将包升级到您的APK中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
android {
...
sourceSets {
    main {
        jniLibs.srcDirs 'imported-lib/src/', 'more-imported-libs/src/'
    }
}

有关更多信息,请查看此处"Include prebuilt native libraries

票数 2
EN

Stack Overflow用户

发布于 2017-11-09 13:05:41

使用共享库(.so文件)不需要使用CMake。只需将这些库放在src/main/jniLibs目录的各个目录中即可。然后你就可以直接加载库了。

Android studio可能会在本机方法声明中显示错误,但您的应用程序将正常工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47202483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文