Java中使用JNI調(diào)用C++

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目錄下

2.5 打開命令行,看圖不說話...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容