gpt4 book ai didi

android - 在 Android Studio (cmake) 中使用预构建的共享库

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:02:47 27 4
gpt4 key购买 nike

我想在我的 Android 应用程序中使用 C++ 共享库。我尝试按照 Google 的 NDK 示例中的 hello-libs 示例进行操作,但不知何故它无法正常工作。

看来,我的库没有打包到 APK 中。我找到的所有教程都使用 *.mk 文件,但我想使用 cmake

这是我的 CMakeLists.txt:

# 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 与其他链接在一起,我就会在运行应用程序时收到以下错误:

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)

看起来在设备上找不到库。否则看起来图书馆的路径仍然是我本地机器上的路径。

最佳答案

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

关于android - 在 Android Studio (cmake) 中使用预构建的共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47202483/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com