You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java 21运行时动态加载外部本地库至JVM的问题求助

Java 21运行时动态加载外部本地库至JVM的问题求助

我需要在Java 21的JVM运行时加载一个包含DLL文件的外部库目录(例如Lic\64bit),并且不能使用反射和Java Foreign Function & Memory API(FFM)。我尝试了几种方法都未能成功加载库,后来发现JAVA_LIBRARY_PATH是一个private static final变量,无法直接修改。

我先尝试了以下代码来更新java.library.path系统属性:

private static void loadAllDLLs(String libraryPathToAdd) {
    final String[] userPath = initializePath("java.library.path");
    String ps = System.getProperty("path.separator");
    //check if the path to add is already present
    for (String path : userPath) {
      if (path.equals(libraryPathToAdd)) {
        return;
      }
    }

    StringBuilder pathBuilder = new StringBuilder();
    for (String pathToAdd : userPath) {
      pathBuilder.append(pathToAdd).append(ps);
    }
    pathBuilder.append(libraryPathToAdd);

    // Update java.library.path once with all paths
    String finalPath = pathBuilder.toString();
    System.setProperty("java.library.path", finalPath);
   

    String[] newUserPath = initializePath("java.library.path");
    for (String up : newUserPath) {
      System.out.println("New User Path ----> " + up);
    }
}

从输出可以看到,java.library.path确实已经包含了我要添加的目录,但当我用下面的代码验证库是否成功加载时,却抛出了UnsatisfiedLinkError,提示找不到指定库:

private static void loadLibraries() {
    String libraryPath = System.getProperty("java.library.path");
    System.out.println("java.library.path: " + libraryPath);

    try {
      System.loadLibrary("webcam-capture-driver-native-64");
      System.out.println("Library loaded successfully.");
    } catch (UnsatisfiedLinkError e) {
      System.err.println("Failed to load library: " + e.getMessage());
    }
  }

明明System.getProperty("java.library.path")的输出显示目标库所在目录已经被添加进去了,但调用System.loadLibrary时还是失败。有没有人遇到过类似的问题?或者有没有其他可行的方法,能在不使用反射和FFM的前提下,在运行时动态加载这个本地库?

备注:内容来源于stack exchange,提问作者Anjana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 17:13:05