繁体   English   中英

com.sun.jna.Memory中返回字符串会导致JVM崩溃

[英]return string in com.sun.jna.Memory causes JVM crash

我正在尝试使用JNA从Java调用AutoItX(封闭源.dll库)。 我使用Wikipedia此博客以及此处的各种帖子来帮助我度过这个艰难的时期。

我从.h文件开始,然后将其转换为Java interface ,然后开始构建所有简单的方法-仅将intWString作为参数的方法。 作为偏执狂类型,我还建立了单元测试以证明一切正常。 我的所有资源都可以在sourceforge上找到。

当我使用一些在传递的参数之一中返回内容的方法时,问题就开始了。

从头文件中,我获得了:

AU3_API void WINAPI AU3_WinGetText(LPCWSTR szTitle, LPCWSTR szText, LPWSTR szRetText, int nBufSize);

szRetText是我要找回价值的地方。 在Java中,我将其翻译为:

import com.sun.jna.Memory;
import com.sun.jna.WString;
void AU3_WinGetText(WString szTitle, WString szText, Memory szRetText, int nBufSize);

我尝试用以下方式调用它:

import com.sun.jna.Memory;
import com.sun.jna.WString;
public String winGetText(String szTitle) {
    Memory szRetText = new Memory(256);
    autoItX.AU3_WinGetText(new WString(szTitle), new WString(""), szRetText, 255);
    return szRetText.getString(0, true);
}

当我尝试自己在单元测试中运行它时,它可以正常工作。 当我运行整个套件时,紧随其后的测试总是会使JVM崩溃。 我尝试了几种不同的方法,它们具有相似的签名,并且结果相同。

有什么建议下一步吗?

请注意,我知道jwinauto (可能还有其他); 但是,我将其作为学习练习来进行。

从@technomage建议中,我最终使用了:

import com.sun.jna.Memory;
import com.sun.jna.WString;
public String winGetText(String szTitle) {
   Memory szRetText = new Memory(2 * 256);
   autoItX.AU3_WinGetText(new WString(szTitle), new WString(""), szRetText, 256);
   return szRetText.getString(0, true);
}

唯一的变化是分配两倍的Memory() ,其他所有都一样。 我觉得这种方法比使用char[]更适合JNA。

暂无
暂无

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

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