【问题标题】:Using jni4net to use Native DLL function in java and getting System.BadImageFormatExceptionjava中使用jni4net使用Native DLL函数并得到System.BadImageFormatException
【发布时间】:2020-08-19 06:47:45
【问题描述】:

我使用jni4net在Java中使用DLL函数。

使用 jni4net-0.8.6.0-bin 我使用命令编译:

.\proxygen.exe "D:\sampledlls\sample_interface.dll" -wd "D:\hope"

执行此命令时,出现以下错误:

System.BadImageFormatException: Could not load file or assembly 'file:///D:\sampledlls\sampledll.dll' or one of its dependencies. The module was expected to contain an assembly manifest.

我还使用 JNA 库来使用 java 中的 DLL 函数。但在这方面,我也收到以下错误:

java.lang.UnsatisfiedLinkError: Unable to load library 'sampledll': The specified module could not be found.

这是我的 JNA 代码:

public class hellodll {
    public interface dcmInterfaceDLL extends Library {
        public void DCM_InitializeFields();
    }

    public static void main(String[] args) { 
        System.out.println(System.getProperty("java.library.path")); 
        System.setProperty("jna.library.path",
            "C:\Users\320035705\Downloads\JNAHelloWorldMWrobel\JNAHelloWorldMWrobel\sampledlls");
        dcmInterfaceDLL sdll = (dcmInterfaceDLL) 
        Native.loadLibrary("sample_interface", dcmInterfaceDLL.class);

        System.loadLibrary("sample_interface");

       sdll.DCM_InitializeFields(); 
    }
}

这是一个 native.dll。

如何加载我的 DLL?

【问题讨论】:

  • 您能否发布您正在使用的确切代码(jni4netjna)?这可能是一个简单的字符串转义斜线情况。
  • @DanielWiddis 发布了 jna 和 jni4net 的代码!

标签: java dll jna jni4net


【解决方案1】:

对于jni4net 版本,它正确找到了dll,但格式错误。您可能正在使用带有 64 位 DLL 的 32 位 JVM,反之亦然。您可以尝试将/32BIT+ /force 开关添加到proxygen 命令行。

由于错误消息提到了它的依赖关系,因此 DLL 可能存在其他问题。您的 cmets 指示与 Visual C++ 运行时包相关的错误消息。


对于 JNA 库加载,由于反斜杠转义不当,您找不到 DLL。

在 Java(和许多其他语言)中,反斜杠 (\) 是转义字符。在字符串中使用时,它具有特殊含义,例如 (\n) 表示换行符。

在代表路径的字符串中,您没有转义反斜杠,因此字符串"C:\Users\320035705\Downloads\JNAHelloWorldMWrobel\JNAHelloWorldMWrobel\sampledlls" 最终被解释为"C:Users320035705DownloadsJNAHelloWorldMWrobelJNAHelloWorldMWrobelsampledlls"

使用两个反斜杠 (\\) 来表示 Java 字符串中的单个反斜杠。如果您像这样指定路径,它应该适用于 JNA:

System.setProperty("jna.library.path",
    "C:\\Users\\320035705\\Downloads\\JNAHelloWorldMWrobel\\JNAHelloWorldMWrobel\\sampledlls");

但是,如果 DLL 需要另一个依赖项的问题,这可能会因为同样的原因而失败。

【讨论】:

  • 即使在设置了两个反斜杠之后,我也会遇到同样的错误。
  • 这是一个 32 位 dll,在 IIS 管理器中我启用了启用 32 位应用程序为 True,尽管我在使用 jni4net 时遇到错误
  • 我尝试使用命令“rundll32.exe sample_interface.dll,DCM_InitializeFields”运行 dll。收到错误应用程序无法启动,因为它的并排配置不正确。请查看应用程序事件日志或使用命令行 sxstrace.exe 工具了解更多详情
  • 这意味着您需要 Visual C++ 运行时包。见this link
  • 该错误已解决。但出现另一个错误:线程“main”中的异常 java.lang.UnsatisfiedLinkError: C:\Users\320035705\Downloads\JNAHelloWorldMWrobel\JNAHelloWorldMWrobel\sampledlls\sample_interface.dll: 找不到依赖库
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-27
  • 1970-01-01
  • 2019-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多