Java中有一个native关键字,用来表示本地方法。
那么何为本地方法?本地方法就是用C或者C++写的函数。
当你已经有了一个C函数,可以完成你需要的功能,可以在Java中调用它,而不需要重新写一遍。
public class test{
public native static void fun();
}
test.fun("message!");
你可以编译这个类,但会报错“UnsatisfiedLinkError”,原因是Java虚拟机找不到这个方法。因此,给JRE提供足够多的信息,使得它可以找到该方法,问题才能解决。
在JDK中需要三步:
为函数产生一个代码存根,它充当Java和C的中间人,从虚拟机中取出信息传递给已经编译好的C函数。
创建一个特殊的共享库,从共享库中输出存根代码
- 使用System.loadlibrary()的特殊方法,通知JRE从步骤2装载这个库。
编写相应的C函数:使用Java方法的全名,即test.fun。如果该类在一个包中,需要加上包名,如 com.packagename.test.fun。用下划线代替句号,并加上Java_即为Java_com_packagename_test_fun.
之后需要用javah程序产生test.h的头文件,将头文件拷贝到源文件,并提供实现代码。
#include "test.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_com_packagename_test_fun(JNIEnv* env,jclass cl)
{
//fun的具体实现,例如:
printf("message");
}
再编译c 代码到一个动态装载库。
最后添加System.loadlibrary()确保虚拟机首次执行该方法前可以装载这个库。最简单的方法如下:
使用静态代码块的形式
public class test{
public native static void fun();
static
{
System.loadlibrary();
}
}
最后执行test.fun();将会输出message.