Java调用Native方法
Java中支持调用其他语言(C、C++),想要实现调用,需要进行以下几步操作。
编写Java类并声明Native方法
package my.mynative.background;
public class Student {
public native int getAge();
public native void setAge(int age);
static{
//载入动态链接库,参数为动态链接库的名称
System.loadLibrary("Student");
}
}
生成**.h头文件
**.h文件是C或者C++语言中的头文件,类似于Java中的接口类
首先将Java类进行javac Student.java 编译成class文件
使用JDK自带jni生成**.h头文件,命令为:javah -jni Student
**.h文件生成后名称为my_mynative_background_Student.h,打开该文件结果如下:
/*这个文件正常情况下不用修改*/ /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class Student */ #ifndef _Included_Student #define _Included_Student #ifdef __cplusplus extern "C" { #endif /* * 这个是根据我们Java中定义的Native方法自动生成的 * Java_my_mynative_background_Student_getAge名称生成的规则为:Java_类的包名_类名_方法名 * Class: Student * Method: getAge * Signature: ()I */ JNIEXPORT jint JNICALL Java_my_mynative_background_Student_getAge (JNIEnv *, jobject); /* * 同上方一样,也是自动生成的 * Class: Student * Method: setAge * Signature: (I)V */ JNIEXPORT void JNICALL Java_my_mynative_background_Student_setAge (JNIEnv *, jobject, jint); #ifdef __cplusplus } #endif #endif
生成DLL文件
我们在这里生成DLL文件使用的工具为DEV-C,可以自行去网上下载。
(注:下载时请根据自己的操作系统位数下载,比如64位操作系统下载时请下载支持64位的工具)
下载安装完成之后打开DEV工具,点击左上角:文件->新建->项目->basic->DLL,然后选择C项目,名称为System.loadLibrary时参数的名称,然后选择工作空间。
创建完成后左侧目录中就可以看到自己新建的DLL项目,然后点击项目右键,选择New File,创建一个后缀为.cpp的文件(.cpp文件类似于Java中的接口实现类),编写如下信息:
/*#include类似Java中的import,将我们刚刚生成头文件**.h通过""引入 (双引号引入默认会从编辑的文件目录开始查找,尖括号引入的头文件会从系统目录开始查找)*/ #include "my_mynative_background_Student.h" /*引用C内置头文件*/ #include <stdio.h> /*引用JDK中jni头文件*/ #include <jni.h> int age; /* * 重写我们刚刚生成的.h头文件中定义的方法,请注意要给参数加上名称(JNIEnv对象提供了java与C类型互转或者调用java方法提供了工具方法,jobject是如果在java中定义的Native方法是类方法,那么它则是该类的对象,如果是静态Native方法,则····百度去吧) * Class: Student * Method: getName * Signature: ()Ljava/lang/String; */ JNIEXPORT jint JNICALL Java_my_mynative_background_Student_getAge (JNIEnv *env, jobject obj){ /*返回值为jint,jint可以和C中int直接互转,不需要其他操作,但是如果是其他类型,比如String或者java的对象类型的话需要进行其他的辅助操作进行转换*/ return age; } /* * Class: Student * Method: setName * Signature: (Ljava/lang/String;)V */ JNIEXPORT void JNICALL Java_my_mynative_background_Student_setAge (JNIEnv *env, jobject obj, jint a){ age = a; }
.cpp文件编写完成之后我们需要将其依赖的.h头文件复制到相应的目录中
- 将我们自己生成**.h头文件放入与.cpp文件相同目录下
- 将%JAVA_HOME%/include/jni.h文件和%JAVA_HOME%/include/win32/jni_md.h文件复制到系统目录/include下(系统目录即使用的工具IDE安装目录下会有一个include,该目录下存放的是C内置的头文件,比如我的安装路径为:C:\Program Files (x86)\Dev-Cpp,那么我需要复制到C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\include目录下,具体地址需要看情况)
然后点击运行->编译,之后在我们的工作空间中就可以找到.dll文件
运行Java程序并调用本地方法
将dll文件复制到我们的Eclipse项目中,具体放到哪里自己决定,我的项目将dll文件复制到src/main/resources/dll路径
然后右键项目->properties->java Build Path->Source->MyNative/src/main/java(定义Native方法所在的类的包)->Native libary location,然后点击右侧Edit->Workspace选择src/main/resources/dll目录即可
调用本地方法,进行测试。