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

时间:2014-05-15 23:07:10

标签: java jna autoit

我试图使用JNA从Java调用AutoItX(一个闭源.dll库)。 我使用wikipediathis blog,以及此处的各种帖子来帮助我渡过难关。

我从.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(可能还有其他人);但是,我这样做是为了学习练习。

1 个答案:

答案 0 :(得分:0)

从@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.