今天学习Java看到Jni部分, 终于看到Java如何调用其他语言写的函数(我期待已久了….
:P)
下面把过程写下来,免得以后忘了又要是处找资料.
首先是Java写的测试类
public class TestJni
{
native void SetMouseRangle(int left, int right, int top, int bottom);
static{
System.loadLibrary("TestJni");
}
public static void main(String []args){
TestJni test = new TestJni();
test.SetMouseRangle(0,0,0,0);
test.SetMouseRangle(100,100,200,200);
}
}
SetMouseRangle用它来代替同名的本地函数,它的前面必须要有native关键字,而且它不能有函数体.这个函数是为了指定一个矩形的范围,把鼠标限定在这个矩形里面5秒钟.
static{
System.loadLibrary("TestJni");
}
是为了加载TestJni.dll的(在其他平台上动态库的后缀名不为dll,这里由系统自己判断后缀名是dll还是os等),本地的SetMouseRangle就放在这个动态库中.
然后用javac生成class文件.用,javah生成c语言的头文件.
然后打开C++编译器,新建一个win32动态链接库项目.把生成的TestJni.h头文件包含进去就行了.
然后 #include"TestJni.h"
创建一个导出函数
JNIEXPORT void JNICALL Java_TestJni_SetMouseRangle
(JNIEnv *, jobject, jint left, jint right, jint top, jint bottom)
{
RECT rect;
rect.left = left;
rect.right = right;
rect.top = top;
rect.bottom = bottom;
ClipCursor(&rect);
Sleep(5000);
ClipCursor(0);
}
ClipCursor
为一个Win32 API函数,作用是把鼠标限定在传入的矩形范围内.最后要调用ClipCursor(0);
否则鼠标将一直被限定在那个矩形范围内.
然后编译,在这里处了点问题,提示找不到Jni.h,想到一个笨办法,把Jni.h的目录附加进来.我的
Jni.h所在目录为C:/Program Files/Java/jdk1.6.0/include,还要把一个目录附加进来,因为还会用到C:/Program Files/Java/jdk1.6.0/include/win32这个目录中的头文件
然后编译,将生成的dll拷贝到class所在目录,如果名字不为TestJni.dll就把它改为这个名字,就可以运行了.