繁体   English   中英

Java JNA无效的内存访问

[英]Java JNA Invalid Memory Access

我有一个用Delphi编写的DLL(没有源代码,只有API)。 这是我试图通过Java使用JNA(版本5.4.0)调用的DLL函数

DLL函数

以下显示了我的Java代码的外观。

public interface FPrintDLL extends StdCallLibrary {
    FPrintDLL INSTANCE = Native.load("FPrintDLL", FPrintDLL.class);
    int OPEN_TCPIP(WString ipAddress, int port, int deviceIndex, WString serialKey);
}

public static void main(String[] args) {
    FPrintDLL fPrintDLL = FPrintDLL.INSTANCE;
    WString ipAddress = new WString("192.170.1.3");
    WString serialKey = new WString("12345678");
    int deviceIndex = 4004;
    int port = 9100;

    int connectResult = fPrintDLL.OPEN_TCPIP(ipAddress, port, deviceIndex, serialKey); // Line 81
}

一切都很好,问题是我得到以下异常,

Exception in thread "main" java.lang.Error: Invalid memory access
at com.sun.jna.Native.invokeInt(Native Method)
at com.sun.jna.Function.invoke(Function.java:426)
at com.sun.jna.Function.invoke(Function.java:361)
at com.sun.jna.Library$Handler.invoke(Library.java:265)
at com.sun.proxy.$Proxy0.OPEN_TCPIP(Unknown Source)
at HelloJNA.main(HelloJNA.java:81)

根据异常日志,问题是由于int而发生的。 根据方法签名,它不使用任何指针/引用。 所以我不确定究竟是什么问题。

- 我设法在相同条件下成功运行此函数(OS,JAVA,DLL架构如下所列),使用下面的C#代码,

[DllImport(FPRINT_DLL, CallingConvention = CallingConvention.StdCall)]
public static extern int OPEN_TCPIP([MarshalAs(UnmanagedType.BStr)] string ipAddress,
        int tcpPort,
        int deviceIndex,
        [MarshalAs(UnmanagedType.BStr)] string serialKey);

我之所以提到这是因为确认OPEN_TCPIP的给定API是正确的。 现在我想在Java和DLL之间进行直接交互。 (不使用某种包装类)

DLL是一个32位DLL,我在32位JVM,Windows10 64位上尝试它。 仅供参考我尝试了以下来源(列出的很少),但无法解决这个问题。

DLL问题和无效的内存访问

Java本机访问代码错误:“无效的内存访问”

函数调用返回java.lang.Error:无效的内存访问

JNA:java.lang.Error:无效的内存访问

Java使用JNA调用DLL错误:无效的内存访问 (所有必需的DLL都在同一目录中)

线程“main”中的JNA异常java.lang.Error:无效的内存访问

有谁知道如何解决这个问题?

方法签名需要BSTR ,它需要在C端分配内存。 您正在传递导致无效内存访问的WString

为BSTR参数分配内存,如下所示:

BSTR ipAddress = OleAuto.INSTANCE.SysAllocString("192.170.1.3");
BSTR serialKey = OleAuto.INSTANCE.SysAllocString("12345678");

完成BSTR后,必须释放内存:

OleAuto.INSTANCE.SysFreeString(ipAddress);
OleAuto.INSTANCE.SysFreeString(serialKey);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM