在Android Studio中使用预构建的共享库(cmake) [英] Using a prebuilt shared Library in Android Studio (cmake)
问题描述
我想在我的Android应用程序中使用C ++共享库.
我尝试按照Google NDK示例中的hello-libs
示例进行操作,但是由于某种原因它无法解决问题.
I want to use a C++ shared library inside my Android App.
I tried to follow along the hello-libs
example from Google's NDK samples, but somehow it doesn't work out.
似乎我的媒体库没有打包到APK中.我发现的所有教程都使用*.mk
-文件,但是我想使用cmake
.
It seems, that my library isn't packed into the APK. All tutorials i found are using *.mk
-files, but I want to use cmake
.
这是我的CMakeLists.txt:
This is my 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
与其他链接在一起时,在运行应用程序时出现以下错误:
As soon as I link the shared-lib
along with the others, I get the following error, when running the app:
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)
似乎在设备上找不到该库.否则,看起来librarie的路径仍然是我本地机器上的路径.
It looks like the library is not found on the device. Otherwise it looks like the librarie's path is still the one on my local maschine.
推荐答案
预构建的 libLibrary.so 没有SONAME.如果出于某种原因无法使用最新的NDK重建该库,则可以尝试使用 patchelf 实用程序将SONAME添加到现有的二进制文件中.
The prebuilt libLibrary.so does not have SONAME. If for whatever reason you cannot rebuild this library with latest NDK, you may try the patchelf utility to add SONAME to existing binary.
这篇关于在Android Studio中使用预构建的共享库(cmake)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!