无法加载应用程序中存在的本机库
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
我正在使用 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