JNI:Java程式碼呼叫原生程式碼

BUG弄潮兒發表於2022-03-02

1. JNI概述

JNI 是 Java Native Interface 的簡稱

  • Java是跨平臺的程式語言,但是在有些時候仍然是有需要呼叫原生程式碼(這些程式碼通常是由 C 與 C++ 編寫的)。
  • JNI 是 Java 平臺的一個功能強大的介面。這個 JNI介面提供了Java與作業系統原生程式碼相互呼叫的功能。

2. C/C++程式碼的步驟

  • 在 Java 類中宣告一個native方法
public native void sayHello();
  • 使用 javah 命令生成包含 native 方法宣告的C/C++標頭檔案
javah com.omg.NativeLib
  • 將生成的C/C++標頭檔案來編寫C/C++原始檔
#include<iostream>
#include "com_omg_NativeLib.h"
using namespace std;

JNIEXPORT void JNICALL Java_com_olive_NativeLib_sayHello (JNIEnv *, jobject){
    cout << "hello world" << endl;
}
  • 將C/C++原始檔編譯成動態連結庫(windows對應DLL,Linux對應so)
  • 把dll檔案的路徑新增到環境變數PATH中
  • 在Java類中載入dll檔案,然後呼叫宣告的native方法
System.load("C:\\lib\\NativeCodeJni.dll");
NativeLib nl = new NativeLib();
nl.sayHello();

或者

System.loadLibrary("NativeCodeJni");
NativeLib nl = new NativeLib();
nl.sayHello();

3. 使用JNI弊端

  • 使用了 JNI,那麼這個Java Application 將不能跨平臺了。如果需要移植到別的平臺上,那麼需要重新編寫native程式碼
  • Java 是強型別的語言,而 C/C++並不是。因此,在編寫JNI時要更小心
  • 總之,必須在構建Java程式的時候,儘量少用原生程式碼

Visual studio環境配置

相關文章