先看下错误:
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, 然后就不报错了。
每个人碰到的问题都不一样,还是希望能帮到和我问题一样的人。