java - Java JNA 无效的内存访问
问题描述
我有一个用 Delphi 编写的 DLL(没有源代码,只有 API)。这是我尝试使用 JNA(版本 5.4.0)通过 Java 调用的 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)
根据异常日志,问题是由于整数而发生的。根据方法签名,它不使用任何指针/引用。所以我不确定到底是什么问题。
注意- 我使用以下 C# 代码在相同条件下成功运行此功能(操作系统、JAVA、DLL 架构如下所列),
[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 位上尝试它。仅供参考,我尝试了以下来源(列出了一些),但无法解决。
Java Native Access 代码错误:“无效的内存访问”</a>
函数调用返回 java.lang.Error: 无效的内存访问
Java use JNA call dll error:Invalid memory access (所有需要的DLL都在同一个目录下)
线程“main”java.lang.Error 中的 JNA 异常:内存访问无效
有谁知道如何解决这个问题?
解决方案
方法签名需要BSTR
在 C 端分配内存。您正在传递WString
导致无效内存访问的 a 。
为 BSTR 参数分配内存,如下所示:
BSTR ipAddress = OleAuto.INSTANCE.SysAllocString("192.170.1.3");
BSTR serialKey = OleAuto.INSTANCE.SysAllocString("12345678");
完成BSTR
s 后,您必须释放内存:
OleAuto.INSTANCE.SysFreeString(ipAddress);
OleAuto.INSTANCE.SysFreeString(serialKey);
推荐阅读
- swift - NSTextField 使用 Tab 键更改焦点顺序
- scala - 在 Scala 中,具有 main 方法的多个对象可以存在于单个文件中并单独运行。这背后的原因是什么?
- python - 应用过滤器后使用 django-rest-framework 获取模型的随机对象
- python - How to apply function to all rows in data frame?
- bash - 如何将gunzip流发送到另一台服务器而不在本地解压缩?
- php - 更新在 laravel 中填充了错误旧数据的表单字段
- python-3.x - Selenium(Python)在自动登录后找不到动态加载的 JavaScript 表
- sql - 为什么 MongoDB skip() 不使用索引?
- python - readthedocs 上的 Sphinx 扩展
- gcc - 为什么在使用 gcc -o2 优化时添加延迟?