我试图使用JNA从Java调用AutoItX(一个闭源.dll库)。 我使用wikipedia,this blog,以及此处的各种帖子来帮助我渡过难关。
我从.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(可能还有其他人);但是,我这样做是为了学习练习。
答案 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.