1,JNI是什么塘偎?
JNI即Java Native Interface(Java本地接口)综看,是一個(gè)協(xié)議,主要作用為:實(shí)現(xiàn)Java調(diào)用c/c++代碼(類庫(kù)),或者C/C++調(diào)用Java代碼
2,主要實(shí)現(xiàn)如下:
2.1, 首先在本地任意的一個(gè)目錄下創(chuàng)建2各類JNI.java 和Test.java,我在D:\JNITest目錄下創(chuàng)建了這兩個(gè)文件
//JNI.java文件
public class JNI{
//創(chuàng)建一個(gè)native接口方法,此方法在C++代碼中實(shí)現(xiàn)
public native int call();
//靜態(tài)代碼塊葛碧,加載由C++代碼生成的.dll動(dòng)態(tài)鏈接文件(.dll相當(dāng)于Java中的jar包吧...)
static{
System.loadLibrary("JNIdll");
}
}
//Test.java文件
public class Test{
public static void main(String[] args){
//創(chuàng)建JNI的對(duì)象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文件)來(lái)實(shí)現(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){
//實(shí)現(xiàn)代碼
int i = 777;
return i;
}
2.4 使用C++編譯器生成.dll動(dòng)態(tài)鏈接文件
- 首先需要有C++的編譯器,因?yàn)槲业碾娔X上裝了VS2013俺祠,所以有C++的編譯器公给,需要使用 cl 命令,所以先將cl的目錄路勁設(shè)置到系統(tǒng)的path環(huán)境變量中蜘渣,不然系統(tǒng)不識(shí)別此命令(提示cl不是內(nèi)部或者外部命令)淌铐,目錄路徑如下:
- 需要將java目錄下的include目錄下的兩個(gè)文件jni.h和jni_md.h(jni_md.h在include目錄下的win32目錄中)拷貝到vc的include目錄下