首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JNI 技術詳解:Java 調用本地 C/C++ 完整流程

     編輯:Java 相關知識

什麼是 JNI

JNI (Java Native Interface) 從 Java 1.1 成為平台標準,允許 Java 代碼與本地已編譯語言(主要是 C/C++)交互。雖設計針對 C/C++,但任何支持調用約定的語言均可使用。

典型應用場景

  1. Java 無對應 API 獲取文件屬性等系統級信息。
  2. 整合非 Java 實現的現有系統(如 C++ 核心庫)。
  3. 高性能算法已封裝在 DLL/.so 中,需從 Java 調用。

無 JNI 時上述場景開發維護成本極高。

JNI 開發標準流程

1. 編寫 Java 類聲明 native 方法

class HelloWorld {
    private native void print();
    static { System.loadLibrary("HelloWorld"); }
    public static void main(String[] args) { new HelloWorld().print(); }
}

2. 編譯 Java 文件

javac HelloWorld.java

3. 生成 C/C++ 頭文件 (.h)

javah -jni HelloWorld

生成 HelloWorld.h,包含函數聲明 Java_HelloWorld_print(命名規則:Java_類全名_方法名)。

4. 實現本地代碼並編譯為動態庫

HelloWorld.c:

#include 
#include "HelloWorld.h"
#include 

JNIEXPORT void JNICALL Java_HelloWorld_print(JNIEnv *env, jobject obj) {
    printf("Hello from C!\\n");
}

Linux 編譯命令:

gcc -I/usr/lib/jvm/java-6-sun/include -I/usr/lib/jvm/java-6-sun/include/linux \
    -fPIC -shared -o libHelloWorld.so HelloWorld.c

Windows 用 cl.exe 或 MinGW 生成 HelloWorld.dll。

5. 運行 Java 程序加載庫

java -Djava.library.path=. HelloWorld

輸出:Hello from C!

關鍵點補充

  • System.loadLibrary 參數不帶前綴「lib」和後綴「.so/.dll」,跨平台自動映射。
  • -Djava.library.path 指定動態庫搜索路徑,亦可將庫放入系統路徑 (PATH/LD_LIBRARY_PATH)。
  • JNIEnv 指針提供大量訪問 Java 對象、調用方法、拋出異常的函數。
  • 引用類型:jobject (局部引用)、jglobalRef (全局引用)、jweak (弱引用),生命周期管理至關重要。
  • 異常處理:本地代碼拋出異常需用 ThrowNew,Java 端捕獲。

出處:博客原文

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved