java - 命名空间 "classloader-namespace"无法访问库

标签 java android shared-libraries static-libraries

我想在我的 Android Studio 项目中导入以下库,这些库位于/system/lib64/文件夹中。
我遇到错误

2020-01-06 13:23:31.358 5171-5171/org.strongswan.android E/AndroidRuntime: FATAL EXCEPTION: main
    Process: org.strongswan.android, PID: 5171
    java.lang.UnsatisfiedLinkError: dlopen failed: library "/system/lib64/libstrongswan.so" needed or dlopened by "/system/lib64/libnativeloader.so" is not accessible for the namespace "classloader-namespace"
        at java.lang.Runtime.loadLibrary0(Runtime.java:1016)
        at java.lang.System.loadLibrary(System.java:1669)
        at org.strongswan.android.logic.CharonVpnService.<init>(CharonVpnService.java:730)
        at java.lang.Class.newInstance(Native Method)
        at android.app.AppComponentFactory.instantiateService(AppComponentFactory.java:103)
        at android.app.ActivityThread.handleCreateService(ActivityThread.java:3740)
        at android.app.ActivityThread.access$1400(ActivityThread.java:238)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1803)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7073)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:964)

上线 System.loadLibrary("strongswan")
        System.loadLibrary("strongswan");

        if (MainActivity.USE_BYOD)
        {
            System.loadLibrary("tncif");
            System.loadLibrary("tnccs");
            System.loadLibrary("imcv");
        }

        System.loadLibrary("hydra");
        System.loadLibrary("charon");
        System.loadLibrary("ipsec");
        System.loadLibrary("androidbridge");
    }

最佳答案

从 Nougat 开始,Android 阻止了来自系统库的私有(private)符号的运行时链接(参见 Android Developers 中的 this blogpost)。
你有两个选择:

  • 将这些库包含在您的 APK 中,这样您就无需在 /system/lib/ 中查找它们;或
  • 修改您的 Android ROM,以便将这些库视为公共(public)库。这可以通过将这些库添加到 /system/etc/public.libraries.txt 来完成。 .
  • 关于java - 命名空间 "classloader-namespace"无法访问库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59608865/

    相关文章:

    java - 用Java创建数据结构

    java - 轮询字段中的空值时删除

    java - 从初始屏幕导航到下一个屏幕时出错

    android - 如何以编程方式检查删除动画辅助功能设置的状态

    c++ - 除了共享库之外,g++ -fPIC 是否也适用于可执行文件?

    shared-libraries - 是否可以静态链接共享对象?

    java - 如何使用 okhttp 执行 Reddit 帖子

    java - 当我使用 akka 流在现有消费者组中创建新消费者时,如何寻求 kafka 主题的结束?

    android - 如何在 Jetpack Compose 中使文本可滚动

    c++ - ldd 可执行文件输出中缺少动态加载的库