[TOC]
# 本地方法JNI
|技術邊界|Java本地方法,是Java調用本地(C/C++)庫方法的技術標準|
|:-:|:-|
|特性|跨語言調用:Java調用C/C++方法<br>性能提高:執行本地方法,避開JVM占用的資源<br>已有功能利用:利用現有的C/C++庫|
|使用場景|需要調用底層系統API<br>需要資源密集型計算<br>需要使用現有的C/C++庫|
|應用方法|編寫.h頭文件:聲明native方法<br>編譯.h到.h文件:使用javah工具<br>編寫.c(或.cpp)文件:實現native方法<br>編譯.c(.cpp)到動態庫(.so文件):使用gcc(Linux)或VS(Windows)<br>在Java中調用native方法|
## JNI與項目中的結構關系:
|項目結構|JNI接口|
|:-:|:-|
|Java源碼|.java文件:包含調用native方法的Java類|<br>.h頭文件:聲明native方法的頭文件|
|編譯生成|無|.h頭文件:.h文件,由javah生成<br>動態庫文件(.so或.dll):由C/C++編譯生成|
|項目部署|無|將相關的.h文件、動態庫文件部署到系統相應位置|
## JNI實現關鍵流程:
|流程|描述|
|:-:|:-|
|編寫Java類|包含native方法聲明的Java類|
|生成.h頭文件|使用javah工具生成.h頭文件|
|編寫C/C++實現|編寫.c或.cpp文件,實現.h中聲明的native方法|
|編譯C/C++代碼|生成動態庫(.so或.dll文件)|
|部署動態庫|將動態庫部署到系統內|
|從Java調用|Java程序調用native方法,最終執行C/C++實現的方法|
## 總結:
JNI允許Java調用C/C++本地方法,可以利用C/C++提供的功能,提高性能,或調用系統底層API。其關鍵流程是:定義native方法、生成.h頭文件、實現C/C++方法、編譯為動態庫、部署使用。JNI需要理解Java、C/C++兩種語言,并實現兩者之間的交互。
# 2. 示例
> ## 編寫Java和C++ , 調用C++本地方法,
Java代碼:
~~~
java
public class JNITest {
// 聲明native方法,無方法體
public native void sayHello();
public static void main(String[] args) {
// 加載動態庫
System.loadLibrary("JNITest");
// 創建實例,調用native方法
new JNITest().sayHello();
}
}
~~~
C++代碼:
~~~
cpp
// JNITest.h頭文件,由javah生成
#include "JNITest.h"
// 實現Java中聲明的native方法
void JNITest.sayHello() {
// 打印日志
printf("Hello from C++!");
}
~~~
> ## 編譯C++代碼生成動態庫:
~~~
bash
# Linux
g++ -fPIC -shared -o libJNITest.so JNITest.cpp
# Windows
cl /LD JNITest.cpp /FeJNITest.dll
~~~
> ## 部署和執行:
1\. 將生成的動態庫(libJNITest.so或JNITest.dll)放到系統路徑
2\. 編譯Java代碼:`javac JNITest.java`
3\. 執行Java代碼:`java JNITest`
> ## 輸出:
~~~
Hello from C++!
~~~
> ## 注釋:
\- Java中聲明native方法,沒有方法體
\- 用javah生成.h頭文件
\- C++中實現native方法
\- C++編譯為動態庫
\- Java加載動態庫并調用native方法
\- 最終執行C++中的實現,實現Java和C++的交互
這個示例演示了JNI的完整流程和Java調用C++方法的過程。通過定義native方法,生成.h文件,編寫C++實現,編譯為動態庫,Java可以調用C++本地方法,實現跨語言調用。
- 系統設計
- 需求分析
- 概要設計
- 詳細設計
- 邏輯模型設計
- 物理模型設計
- 產品設計
- 數據驅動產品設計
- 首頁
- 邏輯理解
- 微服務架構的關系數據庫優化
- Java基礎架構
- 編程范式
- 面向對象編程【模擬現實】
- 泛型編程【參數化】
- 函數式編程
- 響應式編程【異步流】
- 并發編程【多線程】
- 面向切面編程【代碼復用解耦】
- 聲明式編程【注解和配置】
- 函數響應式編程
- 語法基礎
- 包、接口、類、對象和切面案例代碼
- Springboot按以下步驟面向切面設計程序
- 關鍵詞
- 內部類、匿名類
- 數組、字符串、I/O
- 常用API
- 并發包
- XML
- Maven 包管理
- Pom.xml
- 技術框架
- SpringBoot
- 項目文件目錄
- Vue
- Vue項目文件目錄
- 遠程組件
- 敏捷開發前端應用
- Pinia Store
- Vite
- Composition API
- uniapp
- 本地方法JNI
- 腳本機制
- 編譯器API
- 注釋
- 源碼級注釋
- Javadoc
- 安全
- Swing和圖形化編程
- 國際化
- 精實或精益
- 精實軟件數據庫設計
- 精實的原理與方法
- 項目
- 零售軟件
- 擴展
- 1001_docker 示例
- 1002_Docker 常用命令
- 1003_微服務
- 1004_微服務數據模型范式
- 1005_數據模型
- 1006_springCloud
- AI 流程圖生成
- Wordpress_6
- Woocommerce_7
- WooCommerce常用的API和幫助函數
- WooCommerce的鉤子和過濾器
- REST API
- 數據庫API
- 模板系統
- 數據模型
- 1.Woo主題開發流程
- Filter
- Hook
- 可視編輯區域的函數工具
- 渲染字段函數
- 類庫和框架
- TDD 通過測試來驅動開發
- 編程范式對WordPress開發
- WordPress和WooCommerce的核心代碼類庫組成
- 數據庫修改
- 1.WP主題開發流程與時間規劃
- moho
- Note 1
- 基礎命令