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目录即可
调用本地方法,进行测试。