1.JNI的基本认识。
JNI即Java Native Interface(Java本地接口),主要作用为:它允许Java代码和其他语言写的代码进行交互。本文主要使用Java调用c/c++代码(类库)。
2.具体实现
2.1 首先在本地任意的一个目录下创建2各类JNI.java 和Test.java,我在D:\JNITest目录下创建了这两个文件
//JNI.java文件
public class JNI{
//创建一个native接口方法,此方法在C++代码中实现
public native int call();
// 定义原生getName方法,返回值是String,有两个入参
public native String getName(String name, int sex);
//静态代码块,加载由C++代码生成的.dll动态链接文件(.dll相当于Java中的jar包吧...)
static{
System.loadLibrary("JNIdll");
}
}
//Test.java文件
public class Test{
public static void main(String[] args){
//创建JNI的对象call
JNI call = new JNI();
//调用call()方法;
int i = call.call();
//输出调用后的结果i
System.out.println("调用Java Native Interface,返回:"+i);
System.out.println("调用Java Native Interface,返回:"+call.getName("guohui",27));
}
}
我的目录如下:
2.2 使用javac 编译JNI.java生成字节码文件JNI.class(需要安装配置java环境变量)并使用javah 编译刚生成的字节码文件得到JNI.h文件,具体操作如下:
- 在JNI.java源文件目录下打开命令框(cmd),可以cd切换到该目录也可以通过下面的方法直接打开该目录:
- javac编译(得有java环境)
- javah 编译刚才的JNI.calss字节码文件,注意不要后缀名
- 用Notepad++打开JNI.h文件看看:
2.3 编写C++代码(JNIdll.cpp文件)来实现JNI.java中的call()方法(native修饰的)
//JNIdll.cpp文件
#include<stdio.h>
#include<jni.h>
#include "JNI.h"
JNIEXPORT jint JNICALL Java_JNI_call
(JNIEnv *, jobject) {
//实现代码
int i = 777;
return i;
}
JNIEXPORT jstring JNICALL Java_JNI_getName
(JNIEnv *env, jobject, jstring jstr, jint sex) {
//实现代码
printf("received first:%d second:%d\n", 1, sex);
printf("received first:%s second:%d\n", env->GetStringUTFChars(jstr,false), sex);
return jstr;
}
2.4 使用C++编译器生成.dll动态链接文件
首先需要有C++的编译器,因为我的电脑上装了Visual Studio 2017,所以有C++的编译器,需要使用 cl 命令,所以先将cl的目录路劲设置到系统的path环境变量中,不然系统不识别此命令(提示cl不是内部或者外部命令),目录路径如下:
- 需要将java目录下的include目录下的两个文件jni.h和jni_md.h(jni_md.h在include目录下的win32目录中)拷贝到vc的include目录下
需要注意这两个文件可能存在:jdk1.8.0_211\include目录,也可能像我截图的分别在不同的目录自己找到就行了
把这两个文件拷贝到VC的include目录下
2.5 这一步主要是去编译.cpp生成动态链接文件