JNI方案說明和使用方法介紹

JNI簡介

JNI(Java Native Interface)是Java編程語言中用于實現Java代碼與本地(Native)代碼(通常是C或C++代碼)交互的機制。它允許Java應用程序調用本地代碼中的功能,也可以讓本地代碼調用Java類和方法。JNI在Java平臺上實現了Java與其他編程語言的互操作性。(即可互相調用)


主要目的和用途:

  • 訪問本地功能: JNI允許Java程序通過調用本地代碼來訪問底層系統功能、硬件功能或第三方庫,這些本地代碼通常用C或C++編寫。
  • 性能優化: 有時候,一些計算密集型任務在本地代碼中執行可能比在Java中更高效。通過JNI,你可以將這些任務放在本地代碼中,以提高性能。
  • 平臺特定功能: JNI允許Java程序在需要平臺特定功能的情況下,通過本地代碼調用這些功能,以適應不同的操作系統和硬件環境。
  • 復用現有代碼: 如果已經存在C/C++代碼庫,可以通過JNI將這些庫集成到Java應用程序中,而無需重新實現相同的功能。



基本流程:

  • 編寫本地代碼: 首先,你需要編寫C/C++代碼實現要調用的功能。
  • 生成動態庫: 將C/C++代碼編譯成動態鏈接庫(.dll或.so文件),供Java代碼調用。
  • Java接口定義: 在Java中,你需要編寫一個與本地代碼對應的JNI接口,這樣Java代碼就能夠調用本地功能。
  • 加載本地庫: 在Java代碼中使用System.loadLibrary("libraryName")加載本地庫。
  • 調用本地功能: 通過JNI接口調用本地代碼,執行相應的功能。
  • 資源管理: 注意JNI中需要管理內存和資源,防止內存泄漏和資源泄漏。


需要注意的是,使用JNI涉及到一些底層的編程技巧,以及對內存管理、線程安全等問題的處理。不當的使用可能會導致性能問題和安全隱患。

2 基本概念描述

2.1 基本數據類型

JNI 對于 Java 的基礎數據類型(int 等)和引用數據類型(Object、Class、數組等)的處理方式不同。這個原理非常重要,理解這個原理才能理解后面所有 JNI 函數的設計思路:

基礎數據類型: 會直接轉換為 C/C++ 的基礎數據類型,例如 int 類型映射為 jint 類型。由于 jint 是 C/C++ 類型,所以可以直接當作普通 C/C++ 變量使用,而不需要依賴 JNIEnv 環境對象;


引用數據類型: 對象只會轉換為一個 C/C++ 指針,例如 Object 類型映射為 jobject 類型。由于指針指向 Java 虛擬機內部的數據結構,所以不可能直接在 C/C++ 代碼中操作對象,而是需要依賴 JNIEnv 環境對象。另外,為了避免對象在使用時突然被回收,在本地方法返回前,虛擬機會固定(pin)對象,阻止其 GC。(參考demo中的multipleArray函數實現)


另外需要特別注意一點,基礎數據類型在映射時是直接映射,而不會發生數據格式轉換。例如,Java char 類型在映射為 jchar 后舊是保持 Java 層的樣子,數據長度依舊是 2 個字節,而字符編碼依舊是 UNT-16 編碼。

以下為Java類型與JNI類型的映射關系表,C++開發人員需要特別注意表中byte與char的區別。

Java類型JNI類型描述長度(字節)
booleanjbooleanunsinged char1
bytejbytesigned char1
charjcharunsinged short2
shortjshortsigned short2
intjint, jsizesigned int4
longjlongsigned long8
floatjfloatsigned float4
doublejdoublesigned double8
ClassjclassClass類/
Stringjstring字符串類/
Objectjobject所有java類的父類/
Throwablejthrowable異常對象/
boolean[]jbooleanArray布爾數組/
byte[]jbyteArraybyte數組/
char[]jcharArraychar數組/
s

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/718589.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/718589.shtml
英文地址,請注明出處:http://en.pswp.cn/news/718589.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

無字母數字rce總結(自增、取反、異或、或、臨時文件上傳)

目錄 自增 取反 異或 或 臨時文件上傳 自增 自 PHP 8.3.0 起,此功能已軟棄用 在 PHP 中,可以遞增非數字字符串。該字符串必須是字母數字 ASCII 字符串。當到達字母 Z 且遞增到下個字母時,將進位到左側值。例如,$a Z; $a;將…

C++知識點總結(23):高級模擬算法

高級模擬算法例題 一、P5661 公交換乘1. 審題2. 思路3. 參考答案 二、P1003 鋪地毯1. 審題2. 參考答案 三、P1071 潛伏者1. 審題2. 思路3. 參考答案 一、P5661 公交換乘 1. 審題 2. 思路 總花費中,地鐵是必須花費的,公交車可能不花錢(坐地…

使用VisualDL進行模型訓練和數據可視化

文章目錄 使用VisualDL進行模型訓練和數據可視化1. 環境準備1.1 安裝VisualDL1.2 設置VisualDL 2. 寫入數據并可視化2.1 檢查訓練數據2.2 跟蹤模型訓練2.3 評估模型訓練效果 3. 啟動VisualDL服務4. 總結 使用VisualDL進行模型訓練和數據可視化 VisualDL是飛槳提供的一個可視化…

Java中的Object類詳解

Java中的Object類詳解 1. equals(Object obj)2. hashCode()3. toString()4.getClass()5.notify() 和 notifyAll()6. wait() 和 wait(long timeout)7. clone()8.finalize() Java中的 Object 類是所有類的父類,可以被所有Java類繼承并使用。下面先看下源碼&#xff1a…

google最新大語言模型gemma本地化部署

Gemma是google推出的新一代大語言模型,構建目標是本地化、開源、高性能。 與同類大語言模型對比,它不僅對硬件的依賴更小,性能卻更高。關鍵是完全開源,使得對模型在具有行業特性的場景中,有了高度定制的能力。 Gemma模…

革新商務數據體驗:引領市場的API商品數據接口

在當今商業環境中,革新商務數據體驗對于維持競爭優勢至關重要。API商品數據接口在這一轉型過程中扮演了核心角色,它不僅為企業提供了實時且全面的數據訪問能力,而且還極大地增強了數據的可操作性和決策支持功能。以下是API商品數據接口如何細…

面試數據庫篇(mysql)- 12分庫分表

拆分策略 垂直分庫 垂直分庫:以表為依據,根據業務將不同表拆分到不同庫中。 特點: 按業務對數據分級管理、維護、監控、擴展在高并發下,提高磁盤IO和數據量連接數垂直分表:以字段為依據,根據字段屬性將不同字段拆分到不同表中。 特點: 1,冷熱數據分離 2,減少IO過渡爭…

C語言入門到精通之練習42:畫圖,學用圓畫圓形。

題目&#xff1a;畫圖&#xff0c;學用圓畫圓形。 程序分析&#xff1a;無。 實例 #include <graphics.h> //VC6.0中是不能運行的&#xff0c;要在Turbo2.0/3.0中 int main() { int driver,mode,i; float j1,k1; driverVGA; modeVGAHI; initgraph(&d…

【Micropython基礎】TCP客戶端與服務器

文章目錄 前言一、連接Wifi1.1 創建STA接口1.2 激活wifi接口1.3 連接WIFI1.4 判斷WIFI是否連接1.5 連接WIFI總體代碼 二、創建TCP 客戶端2.1 創建套接字2.2 設置TCP服務器的ip地址和端口2.3 連接TCP服務器2.3 發送數據2.4 接收數據2.5 斷開連接2.6 示例代碼 三、TCP服務器的創建…

批量二維碼的教程和優勢:拓寬應用領域,提升效率與創新

隨著二維碼技術的不斷發展&#xff0c;批量二維碼在多個領域展現出了顯著的優勢&#xff0c;為商業和行業帶來了更多便捷和創新。以下是批量二維碼的一些顯著優勢&#xff1a; 1. 高效快速生成&#xff1a; 批量二維碼一次性生成多個二維碼&#xff0c;相較于逐個生成的方式&…

Linux之進程信號

目錄 一、概念引入 1、生活中的信號 2、Linux中的信號 二、信號處理常見方式 三、信號的產生 1、鍵盤產生信號 2、系統調用接口產生信號 3、軟件條件產生信號 4、硬件異常產生信號 四、信號的保存 相關概念 信號保存——三個數據結構 信號集——sigset_t 信號集操…

超簡單的chatgpt-next-web部署教程!

隨著AI的應用變廣&#xff0c;各類AI程序已逐漸普及&#xff0c;尤其是在一些日常辦公、學習等與撰寫/翻譯文稿密切相關的場景&#xff0c;大家都希望找到一個適合自己的穩定可靠的ChatGPT軟件來使用。 ChatGPT-Next-Web就是一個很好的選擇。它是一個Github上超人氣的免費開源…

Docker基礎教程 - 1 Docker簡介

更好的閱讀體驗&#xff1a;點這里 &#xff08; www.doubibiji.com &#xff09; 1 Docker簡介 Docker是一個強大的容器化平臺&#xff0c;讓你能夠更輕松地構建、部署和運行應用程序。 下面我們來學習 Docker。 1.1 Docker是什么 1 現在遇到的問題 每次部署一臺服務器&…

CSS 入門指南(一)CSS 概述

CSS 概述 CSS 介紹 CSS&#xff08;Cascading Style Sheets&#xff09;通常稱為 CSS 樣式或層疊樣式表&#xff0c;是一種用來為結構化文檔&#xff08;如 HTML 文檔或 XML 應用&#xff09;添加樣式&#xff08;字體、間距和顏色等&#xff09;以及版面的布局等外觀顯示樣式…

《MySQL數據庫》day1

文章目錄 1.名詞解釋2.如何啟動mysql數據庫3.mysql常用命令4.數據庫當中最基本的單元是表&#xff1a;table5.關于SQL語句的分類6.簡單查詢7.條件查詢8.排序9.數據處理函數單行處理函數常見的有哪些&#xff1f; 10.分組函數&#xff08;多行處理函數&#xff09; 1.名詞解釋 …

VUE2與VUE3之間的主要區別

當談到 Vue.js 的版本時&#xff0c;Vue 2 和 Vue 3 是最常被提及的兩個版本。下面是 Vue 2 和 Vue 3 之間的一些主要區別&#xff1a; 1. 性能提升&#xff1a; Vue 3 在底層核心重寫了響應式系統&#xff0c;采用了 Proxy 對象&#xff0c;大幅提高了性能。Vue 3 還引入了靜…

徹底解決華為手機安裝谷歌框架后出現未認證的彈窗問題

引言 本人使用華為手機通過B站等平臺學習如何安裝谷歌框架與商店后&#xff0c;發現安裝谷歌框架后出現未認證的彈窗問題少有解決辦法&#xff0c;而且容易復發&#xff0c;在借鑒相關視頻后找到解決辦法&#xff0c;但視頻中的華谷框架需要付費才能使用&#xff0c;本文將提出…

spring注解驅動系列--自動裝配

Spring利用依賴注入&#xff08;DI&#xff09;&#xff0c;完成對IOC容器中中各個組件的依賴關系賦值&#xff1b;依賴注入是spring ioc的具體體現&#xff0c;主要是通過各種注解進行屬性的自動注入。 一、Autowired&#xff1a;自動注入 一、注解介紹 1、默認優先按照類型去…

高中數學:函數奇偶性

一、定義 偶函數&#xff1a;定義域關于原點對稱&#xff0c;圖像關于Y軸對稱 f(x)f(-x) 奇函數&#xff1a;定義域關于原點對稱&#xff0c;圖像關于原點中心對稱 f(x)f(-x)0 等價于 f(-x)-f(x) 二、函數奇偶性的四種情況 注意&#xff1a; 即奇又偶的函數&#xff0c;只有…

Linux入門到入土

Linxu Linux 簡介 Linux 內核最初只是由芬蘭人林納斯托瓦茲&#xff08;Linus Torvalds&#xff09;在赫爾辛基大學上學時出于個人愛好而編寫的。 Linux 是一套免費使用和自由傳播的類 Unix 操作系統&#xff0c;是一個基于 POSIX&#xff08;可移植操作系統接口&#xff09…