1,JNI是什么?
JNI即Java Native Interface(Java本地接口),是一個協(xié)議,主要作用為:實現(xiàn)Java調(diào)用c/c++代碼(類庫),或者C/C++調(diào)用Java代碼
2,主要實現(xiàn)如下:
2.1, 首先在本地任意的一個目錄下創(chuàng)建2各類JNI.java 和Test.java,我在D:\JNITest目錄下創(chuàng)建了這兩個文件
//JNI.java文件
public class JNI{
//創(chuàng)建一個native接口方法,此方法在C++代碼中實現(xiàn)
public native int call();
//靜態(tài)代碼塊,加載由C++代碼生成的.dll動態(tài)鏈接文件(.dll相當于Java中的jar包吧...)
static{
System.loadLibrary("JNIdll");
}
}
//Test.java文件
public class Test{
public static void main(String[] args){
//創(chuàng)建JNI的對象call
JNI call = new JNI();
//調(diào)用call()方法;
int i = call.call();
//輸出調(diào)用后的結(jié)果i
System.out.println("調(diào)用Java Native Interface,返回:"+i);
}
}
我的目錄如下:
2.2,使用javac 編譯JNI.java生成字節(jié)碼文件JNI.class(需要安裝配置java環(huán)境變量)并使用javah 編譯剛生成的字節(jié)碼文件得到JNI.h文件,具體操作如下:
- 在JNI.java源文件目錄下打開命令框(cmd),可以cd切換到該目錄也可以通過下面的方法直接打開該目錄:
- javac編譯
- javah 編譯剛才的JNI.calss字節(jié)碼文件,注意不要后綴名
- 用Notepad++打開JNI.h文件看看:
2.3 編寫C++代碼(JNIdll.cpp文件)來實現(xiàn)JNI.java中的call()方法(native修飾的)
//JNIdll.cpp文件
#include<stdio.h>
#include<jni.h>
#include "JNI.h"
JNIEXPORT jint JNICALL Java_JNI_call
(JNIEnv *, jobject){
//實現(xiàn)代碼
int i = 777;
return i;
}
2.4 使用C++編譯器生成.dll動態(tài)鏈接文件
- 首先需要有C++的編譯器,因為我的電腦上裝了VS2013,所以有C++的編譯器,需要使用 cl 命令,所以先將cl的目錄路勁設(shè)置到系統(tǒng)的path環(huán)境變量中,不然系統(tǒng)不識別此命令(提示cl不是內(nèi)部或者外部命令),目錄路徑如下:
- 需要將java目錄下的include目錄下的兩個文件jni.h和jni_md.h(jni_md.h在include目錄下的win32目錄中)拷貝到vc的include目錄下