在com.sun. java . memory中返回字符串导致JVM崩溃



我正在尝试使用JNA从Java调用AutoItX(一个闭源.dll库)。我用维基百科,这个博客,还有这里的各种帖子来帮助我度过这段艰难的时光。

我从。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。

相关内容

最新更新