native 修飾的方法表示該方法由非 Java 語言(通常是 C/C++)實現,編譯為平台相關的動態庫(Windows .dll、Linux .so),通過 JNI (Java Native Interface) 供 Java 調用。JDK 源碼中 Object.hashCode()、Thread.start() 等底層方法均為 native。
native 方法,靜態塊 System.loadLibrary("库名") 載入動態庫。javac HelloNative.javajavah HelloNative 產生 HelloNative.h,包含 JNI 規範的函數簽名(如 Java_HelloNative_sayHello)。jni.h 與生成的頭文件,實現邏輯(如 printf("Hello, JNI"))。gcc -shared -o HelloNative.dll HelloNative.c -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32"java HelloNative,控制台輸出 Hello, JNI。Java_全類名_方法名,參數必含 JNIEnv*、jclass/jobject。jint↔int、jstring↔String、jobjectArray↔Object[] 等。ThrowNew,Java 端捕獲。JavaVM 附著。| 適用場景 | 說明 |
|---|---|
| 訪問底層硬件/OS API | Java 無法直接操作寄存器、串口、GPU 等 |
| 復用現有 C/C++ 庫 | 避免重寫成熟算法庫(如圖像處理、加密) |
| 極致效能敏感路徑 | 繞過 JVM 解釋/編譯開銷,但需權衡跨邊界調用成本 |
代價:喪失跨平台性、增加部署複雜度、難以除錯、GC 無法管理堆外內存。原則:能用 Java 解決絕不用 native。