用java做个小玩意,需要调用windows操作系统的动态链接库提供的API函数。
选来选去最终决定用jna实现调用,简单方便。
这个过程中遇到的最大障碍就是怎么传递函数的参数!
ps:原生代码在本文中指x86cpu下运行的c\c++代码。
jre也必须是32位的jre,否则可能发生不明原因的错误。
整理了一个jna与windous API(__stdcall调用约定)的库的数据类型对应表
其中值得注意的:
1:
c\c++中有无符号整数,java中没有,传递接受无符号的数据时要做转换。
例子:unsigned int xx(unsigned int);
你传递参数-1(0xffffffff),函数xx中会认为你传递的参数的值为4294967295
函数返回2147483648(0x80000000),java会认为函数返回的是-2147483648
2:
windows系统提供的api一般都有两个版本:asci 和 Unicode版本,在调用这些api时可能要明确指定调用哪个版本的api.
例如:GetClassName函数就分别有
int GetClassNameA(HWND hWnd, LPSTR IpClassName, int nMaxCount);
int GetClassNameW(HWND h