1,JNI是什么?
JNI即Java Native Interface(Java本地接口),是一个协议,主要作用为:实现Java调用c/c++代码(类库),或者C/C++调用Java代码
2,主要实现如下:
2.1, 首先在本地任意的一个目录下创建2各类JNI.java 和Test.java,我在D:\JNITest目录下创建了这两个文件
//JNI.java文件
public class JNI{
//创建一个native接口方法,此方法在C++代码中实现
public native int call();
//静态代码块,加载由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);
}
}
我的目录如下:
2.2,使用javac 编译JNI.java生成字节码文件JNI.class(需要安装配置java环境变量)并使用javah 编译刚生成的字节码文件得到JNI.h文件,具体操作如下:
- 在JNI.java源文件目录下打开命令框(cmd),可以cd切换到该目录也可以通过下面的方法直接打开该目录:
- javac编译
- 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;
}
2.4 使用C++编译器生成.dll动态链接文件
- 首先需要有C++的编译器,因为我的电脑上装了VS2013,所以有C++的编译器,需要使用 cl 命令,所以先将cl的目录路劲设置到系统的path环境变量中,不然系统不识别此命令(提示cl不是内部或者外部命令),目录路径如下:
- 需要将java目录下的include目录下的两个文件jni.h和jni_md.h(jni_md.h在include目录下的win32目录中)拷贝到vc的include目录下