我正在尝试使用JNA从Java调用AutoItX(一个闭源.dll库)。我用维基百科,这个博客,还有这里的各种帖子来帮助我度过这段艰难的时光。
我从。h文件开始,并将其翻译为Java interface
,并开始构建所有简单的方法-仅将int
或WString
作为参数的方法。作为一个偏执型的人,我也在构建单元测试来证明一切正常。我所有的源代码都可以在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。