无法加载应用程序中存在的本机库

Unable to load native library which is present in the app

我正在使用 Android NDK 构建本机应用程序。它依赖于各种共享对象 (.so)。我已将它们添加到 CMakeLists 中的应用程序中,如下所示:

add_library(bluetooth SHARED IMPORTED)
/home/stoic/fluoride/bt/output_dir/out/Default/lib/libbluetooth.so)
set_target_properties(bluetooth PROPERTIES IMPORTED_LOCATION /home/stoic/lib-bluetooth-x86-64/libbluetooth.so)
add_library(chrome SHARED IMPORTED)
set_target_properties(chrome PROPERTIES IMPORTED_LOCATION /home/stoic/lib-bluetooth-x86-64/libchrome.so)
add_library(grpc++ SHARED IMPORTED)
set_target_properties(grpc++ PROPERTIES IMPORTED_LOCATION /home/stoic/lib-bluetooth-x86-64/libgrpc++.so)
add_library(grpc_wrap SHARED IMPORTED)
set_target_properties(grpc_wrap PROPERTIES IMPORTED_LOCATION /home/stoic/lib-bluetooth-x86-64/libgrpc_wrap.so)


target_link_libraries(native-activity
    android
    native_app_glue
    EGL
    GLESv1_CM
    log
        bluetooth
        chrome
        grpc++
        grpc_wrap
        /home/stoic/lib-bluetooth-x86-64/libstatslog.so
        /home/stoic/lib-bluetooth-x86-64/android.hardware.bluetooth.a2dp@1.0.so
)

我不会写整个 CMakeLists.txt 因为应用程序编译正常并且 apk 已成功构建。

所有 .sos 加载正常,但 Android 运行时为 android.hardware.bluetooth.a2dp@1.0.so 给出此错误:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.native_activity, PID: 4230
    java.lang.UnsatisfiedLinkError: Unable to load native library "/data/app/~~J6dVW4LGncsbvMxzwtgq7w==/com.example.native_activity-Je33LNoodZDV37TTvXSpEw==/lib/x86_64/libnative-activity.so": dlopen failed: library "android.hardware.bluetooth.a2dp@1.0.so" not found: needed by /data/app/~~J6dVW4LGncsbvMxzwtgq7w==/com.example.native_activity-Je33LNoodZDV37TTvXSpEw==/lib/x86_64/libnative-activity.so in namespace classloader-namespace

我检查了构建应用程序的解压 apk,我看到 android.hardware.bluetooth.a2dp@1.0.so 与其他 .sos 一起出现在 lib/x86_64 目录中。

ls lib/x86_64/
android.hardware.bluetooth.a2dp@1.0.so  libbluetooth.so  libchrome.so  libgrpc++.so  libgrpc_wrap.so  libnative-activity.so  libstatslog.so

有谁知道我在做什么有什么问题吗?

我能够通过@Michael 在评论中指出的 answer 解决问题。我发现的另一件事是 Android 也不支持库名称中的字符 @,因此我也不得不将其替换为 _。 Android 中没有关于此的文档,我是通过反复试验发现的。

我使用 sed 而不是原始答案中使用的 rpl。

sed -i "s/@\([0-9]\).\([0-9]\).so/__.so/g" libbluetooth.so

我对我的应用程序中使用的所有库都做了同样的事情。要解决所有库的问题 - 我将所有库复制到一个目录中并使用此脚本:

echo "" > change.log
for var in `ls -1`;do
    echo $var
    sed -i "s/@\([0-9]\).\([0-9]\).so/__.so/g" $var
    new_file=`echo $var|sed "s/@\([0-9]\).\([0-9]\).so$/__.so/g"`
    mv $var $new_file
    objdump -p $new_file | grep so >> change.log
done