Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

java.lang.UnsatisfiedLinkError: dlopen failed: library "/system/lib64/libdl.so" needed or dlopened by "/system/lib64/libnativeloader.so" is not accessible for the namespace "classloader-namespace" #5

Closed
zzyyppqq opened this issue Mar 1, 2023 · 1 comment

Comments

@zzyyppqq
Copy link

zzyyppqq commented Mar 1, 2023

前置条件:
1、系统版本Android7.0、已Root
2、Demo代码未修改逻辑,只添加了几行日志
3、运行前已导入so [libnativecpp.so、libnativecpptwo.so]到此目录: /data/user/0/com.example.nativecpp/files/dynamic_so/
4、
arm-linux-androideabi-readelf -d libnativecpptwo.so

Dynamic section at offset 0xdc8 contains 28 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libnativecpp.so]
0x0000000000000001 (NEEDED) Shared library: [liblog.so]
0x0000000000000001 (NEEDED) Shared library: [libm.so]
0x0000000000000001 (NEEDED) Shared library: [libdl.so]
0x0000000000000001 (NEEDED) Shared library: [libc.so]
0x000000000000000e (SONAME) Library soname: [libnativecpptwo.so]

5、$ /data/user/0/com.example.nativecpp/files/dynamic_so # ls -al
-rwxrwxrwx 1 root root 1414352 2023-03-01 11:48 libnativecpp.so
-rwxrwxrwx 1 root root 60120 2023-03-01 11:48 libnativecpptwo.so

运行日志如下:

2023-03-01 14:38:46.899 5737-5737/com.example.nativecpp I/hello: path /data/user/0/com.example.nativecpp/files/dynamic_so/
2023-03-01 14:38:46.905 5737-5737/com.example.nativecpp I/hello: dependencies: [libnativecpp.so, liblog.so, libm.so, libdl.so, libc.so]
2023-03-01 14:38:46.909 5737-5737/com.example.nativecpp I/hello: dependencies: [liblog.so, libm.so, libdl.so, libc.so]
2023-03-01 14:38:46.909 5737-5737/com.example.nativecpp I/hello: dependencySo: log
2023-03-01 14:38:46.910 5737-5737/com.example.nativecpp I/hello: dependencySo: m
2023-03-01 14:38:46.911 5737-5737/com.example.nativecpp I/hello: dependencySo: dl
2023-03-01 14:38:46.913 5737-5737/com.example.nativecpp E/linker: library "/system/lib64/libdl.so" ("/system/lib64/libdl.so") needed or dlopened by "/system/lib64/libnativeloader.so" is not accessible for the namespace: [name="classloader-namespace", ld_library_paths="", default_library_paths="", permitted_paths="/data:/mnt/expand:/data/data/com.example.nativecpp"]
2023-03-01 14:38:46.914 5737-5737/com.example.nativecpp D/AndroidRuntime: Shutting down VM
2023-03-01 14:38:46.914 5737-5737/com.example.nativecpp E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.nativecpp, PID: 5737
java.lang.UnsatisfiedLinkError: dlopen failed: library "/system/lib64/libdl.so" needed or dlopened by "/system/lib64/libnativeloader.so" is not accessible for the namespace "classloader-namespace"
at java.lang.Runtime.loadLibrary0(Runtime.java:977)
at java.lang.System.loadLibrary(System.java:1530)
at com.example.lib_sillyboy.DynamicSo.loadStaticSo(DynamicSo.java:45)
at com.example.lib_sillyboy.DynamicSo.loadStaticSo(DynamicSo.java:38)
at com.example.nativecpp.MainActivity.onCreate(MainActivity.java:33)
at android.app.Activity.performCreate(Activity.java:6666)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2677)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2789)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1527)
at android.os.Handler.dispatchMessage(Handler.java:110)
at android.os.Looper.loop(Looper.java:203)
at android.app.ActivityThread.main(ActivityThread.java:6251)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)

添加日志代码:
public class DynamicSo {
public static void loadStaticSo(File soFIle, String path) {
try {
ElfParser parser = null;
List dependencies = null;
try {
parser = new ElfParser(soFIle);
dependencies = parser.parseNeededDependencies();
} catch (Throwable e) {
throw e;
} finally {
if (parser != null) {
parser.close();
}
}
Log.i("hello", "dependencies: " + dependencies);
//如果nativecpp3->nativecpptwo->nativecpp 则先加载 DynamicSo.loadStaticSo(nativecpptwo),此时nativecpp作为nativecpptwo的直接依赖被加载了
//不能直接加载nativecpp3,导致加载直接依赖nativetwo的时候nativecpp没加载导致错误。 这个可以优化,比如递归
for (final String dependency : dependencies) {

            try {
                File file = new File(path + dependency);
                if (file.exists()) {
                    //递归查找
                    loadStaticSo(file, path);
                } else {
                    // so文件不存在这个文件夹,代表是ndk中的so,如liblog.so,则直接加载
                    // 把本来lib前缀和.so后缀去掉即可
                    String dependencySo = dependency.substring(3, dependency.length() - 3);
                    //在application已经注入了路径DynamicSo.insertPathToNativeSystem(this,file) 所以采用系统的加载就行
                    Log.i("hello", "dependencySo: " + dependencySo);
                    System.loadLibrary(dependencySo);
                }

            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    } catch (IOException ignored) {
    }
@Leongeneral
Copy link

请问你这个问题解决了吗

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants