如何获取已加载的 JNI 库列表?

新手上路,请多包涵

正如主题所说,Java 中是否有一种方法可以获取在任何给定时间加载的所有 JNI 本机库的列表?

原文由 benhsu 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 632
1 个回答

[ 免责声明:请注意,此解决方案始终是 hackish。而且在大多数情况下,现在已经行不通了。检查 本杰明的答案 以获取更多信息]


如果您愿意的话,有一种方法可以确定所有当前加载的本机库。无法确定已卸载的库。

基于 Svetlin Nakov 的工作( 将 JVM 中加载的类提取到单个 JAR ),我做了一个 POC,它为您提供了从应用程序类加载器和当前类的类加载器加载的本机库的名称。

首先是没有bu的简化版本….它异常处理,漂亮的错误消息,javadoc,….

通过反射获取类加载器存放已加载库的私有字段

public class ClassScope {
    private static final java.lang.reflect.Field LIBRARIES;
    static {
        LIBRARIES = ClassLoader.class.getDeclaredField("loadedLibraryNames");
        LIBRARIES.setAccessible(true);
    }
    public static String[] getLoadedLibraries(final ClassLoader loader) {
        final Vector<String> libraries = (Vector<String>) LIBRARIES.get(loader);
        return libraries.toArray(new String[] {});
    }
}

像这样调用上面的

final String[] libraries = ClassScope.getLoadedClasses(ClassLoader.getSystemClassLoader()); //MyClassName.class.getClassLoader()

voilá libraries 包含加载的本机库的名称。

此处此处 获取完整的源代码

原文由 jitter 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题