使用jni4net在Java中使用本机DLL函数并获取System.BadImageFormatException

问题描述

我正在使用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?

解决方法

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

DLL可能还有其他问题,因为错误消息中提到了它的依赖性。您的注释指示与Visual C ++运行时程序包相关的错误消息。


对于JNA库加载,由于反斜杠转义不正确,因此找不到DLL。

在Java(和许多其他语言)中,反斜杠(\)是转义字符。当在String中使用时,它具有特殊含义,例如({\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需要另一个依赖关系,则可能由于相同的原因而失败。