Android 8.0 dlopen failed 问题
阅读原文时间:2021年04月20日阅读:1

先看下错误:

01-06 22:09:03.069 5075 5075 E linker : library "/system/lib/libHWMI.so" ("/system/lib/libHWMI.so") needed or dlopened by "/data/app/org.ftd.gyn-jbIJZ4TolpZgZ5Ahy1loOg==/lib/arm/libnative-lib.so" is not accessible for the namespace: [name="classloader-namespace", ld_library_paths="", default_library_paths="/data/app/org.ftd.gyn-jbIJZ4TolpZgZ5Ahy1loOg==/lib/arm:/data/app/org.ftd.gyn-jbIJZ4TolpZgZ5Ahy1loOg==/base.apk!/lib/armeabi-v7a", permitted_paths="/data:/mnt/expand:/data/data/org.ftd.gyn"]

以前在Android5.0上直接这样调用是没问题.

s_handle = dlopen("/system/lib/libHWMI.so", RTLD_NOW);

但是项目移植到Android 8.0上就报了如上错误.

说下解决方法,想知道原理的移步:http://jackwish.net/namespace-based-dynamic-linking.html

想看代码的话Android8.0是在: system/core/libnativeloader

其实错误log里面已经提示了,不过会有其它问题.

permitted_paths="/data:/mnt/expand:/data/data/org.ftd.gyn"

放在如上路径下面,虽然dlopen过了,但是报了其他的错误,如"libcutils.so" not found.

/data:/mnt/expand

如上所指的路径在文件 system/core/libnativeloader/native_loader.cpp里面,在它的上面一行我们看到了

static constexpr const char* kPublicNativeLibrariesSystemConfigPathFromRoot =
"/etc/public.libraries.txt"; static constexpr const char* kPublicNativeLibrariesVendorConfig =
"/vendor/etc/public.libraries.txt";

系统的public native lib path: /system/etc/public.libraries.txt, 内容如下:

libandroid.so
libaaudio.so
libc.so
libcamera2ndk.so
libdl.so
libEGL.so
libGLESv1_CM.so
libGLESv2.so
libGLESv3.so
libicui18n.so
libicuuc.so
libjnigraphics.so
liblog.so
libmediandk.so
libm.so
libnativewindow.so
libOpenMAXAL.so
libOpenSLES.so
libRS.so
libstdc++.so
libsync.so
libvulkan.so
libwebviewchromium_plat_support.so
libz.so

厂商的public native lib path: /vendor/etc/public.libraries.txt, 这个文件可能不存在, 没有的可以新建, 然后预置到vendor/etc/下面

因为我操作的是camera和vendor相关,所以在/vendor/etc/public.libraries.txt里面加入我的libHWMI.so, 然后就不报错了。

每个人碰到的问题都不一样,还是希望能帮到和我问题一样的人。

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章