【问题标题】:How to debug loadLibrary to understand why not loading a DLL?如何调试 loadLibrary 以了解为什么不加载 DLL?
【发布时间】:2015-03-10 15:42:23
【问题描述】:

我正在尝试在我的 servlet 定义中加载一个带有静态块的 DLL,如下所示:

    String ehrViewerExternalNativeLibs = "webapps" + pathSeparator +
                                         "ehr-viewer" + pathSeparator +
                                         "WEB-INF" + pathSeparator +
                                         "classes" + pathSeparator +
                                         "extlib";

    try {
        String catalinaHome = System.getProperty("catalina.home");
        String defaultLibraryPath = System.getProperty("java.library.path");
        String sharedLibraryPath = catalinaHome + pathSeparator + ehrViewerExternalNativeLibs;

        if (catalinaHome != null) {
            System.setProperty("java.library.path", defaultLibraryPath + ";" + sharedLibraryPath);
            String curPath = System.getProperty("java.library.path");
            logger.info(curPath);
            System.loadLibrary("awj2k");
            //System.load(sharedLibraryPath + "\\awj2k.dll");
            Class.forName("com.aware.j2k.codec.engine.AwJ2k");
        }

我不断收到这样的错误:

2015 年 3 月 10 日上午 11:17:27 org.apache.catalina.core.StandardWrapperValve 调用 严重:为 servlet ehrViewerServiceImpl 分配异常

java.lang.UnsatisfiedLinkError: java.library.path 中没有 awj2k 在 java.lang.ClassLoader.loadLibrary(未知来源) 在 java.lang.Runtime.loadLibrary0(未知来源) 在 java.lang.System.loadLibrary(未知来源) 在 com.softmedical.ehrviewer.server.EHRViewerServiceImpl.(EHRViewerServiceImpl.java:121)

库路径的输出是:

信息 | 2015-03-10 11:17:27,558 | - D:\Tomcat-7.0\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:\Windows\system32;C:\Windows;C:\Windows\ System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;;.;D:\Tomcat-7.0\webapps\ehr-viewer\WEB-INF\classes\extlib

文件夹extlib的内容是

awj2k.dll

如果我将 DLL 放在 D:\Tomcat-7.0\bin 中,它就可以正常工作。窗帘后面有什么黑暗咒语?为什么我可以从我想要的地方加载 DLL?我看到 java.library.path 设置正确,为什么它不起作用?

【问题讨论】:

    标签: java tomcat loadlibrary


    【解决方案1】:

    类加载器可能没有使用您对java.library.path 的运行时更改。见Adding new paths for native libraries at runtime in Java

    您可以在 servlet 的 init 中使用 System.load 加载库吗?像这样的。

    public void init(ServletConfig config) {
      ServletContext ctx = config.getServletContext();
      String libPath = ctx.getRealPath("/") + "\WEB-INF\classes\extlib\awj2k.dll";
      System.load(libPath);
    }
    

    编辑:我刚刚意识到您要求使用调试方法。尝试定义java.library.path 以在Tomcat 启动配置或命令行中包含awj2k.dll 的目录。如果System.loadLibrary 有效,那将确认在运行时更改库路径无效。

    【讨论】:

    • 文章“添加新路径”帮助我解决了我的问题。使用 -Djava.library.path 测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 2017-10-30
    相关资源
    最近更新 更多