999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Java Native Interface技術研究、設計與實踐

2024-06-03 16:59:08劉玉龍朱文松
數字通信世界 2024年4期

劉玉龍 朱文松

摘要:文章研究Java程序與本機代碼交互的機制,它通過在Java虛擬機(JVM)和本機代碼之間提供一組接口來實現。JNI可用于訪問本機庫、函數和數據結構。通過具體實例的實現,驗證了在保持Java平臺無關性的同時又充分發揮了本地平臺的優勢。

關鍵詞:Java;JNI;Win32

doi:10.3969/J.ISSN.1672-7274.2024.04.026

中圖分類號:TP 309;TP 311.52? ? ? ? ? 文獻標志碼:B? ? ? ? ? ?文章編碼:1672-7274(2024)04-00-03

Research, Design, and Practice of Java Native Interface Technology

LIU Yulong1, ZHU Wensong2

(1. Graduate School of Anhui Jianzhu University, Hefei 230022, China;

2. Xianheng International Technology Co., Ltd., Hangzhou 310000, China)

Abstract: This article investigates the mechanism of interaction between Java programs and native code, which is achieved by providing a set of interfaces between the Java Virtual Machine (JVM) and native code. JNI can be used to access native libraries, functions, and data structures. Through the implementation of specific examples, it has been verified that the advantages of the local platform are fully utilized while maintaining Java platform independence.

Keywords: Java; JNI; Win32

在工程開發過程中,使用“純Java”代碼的解決方案是非常好的,但是有時候某些功能必須引入其他語言的支持。例如,在中小型企業級項目中經常會有一個監測系統性能的模塊,這個模塊需要使用和操作系統相關度較強的功能,如監控磁盤剩余空間、內存使用、處理器占用等。由于這些功能與平臺關聯性較強,Java沒有對這些功能提供支持。不過好在Java提供了JNI(Java Native Interface),它允許在Java虛擬機中運行的Java代碼與用其他編程語言(如C、C++和匯編)編寫的應用程序和庫進行互操作。

1? ?JNI的開發步驟與動態鏈接庫

1.1 JNI的開發步驟

在Java項目中合適的位置加入本地方法,本地方法類似于抽象方法,只有方法簽名沒有方法實現。不同于抽象類和接口,擁有本地方法的類是一個完整的能夠實例化的類,只是它的方法由本地代碼實現。經過編譯器編譯,帶有本地方法的類會生成一個字節碼文件。使用javah可以從這個字節碼文件產生一個C語言的頭文件,javah可以在jdk/bin目錄下找到。創建一個C/C++的工程用于創建動態鏈接庫,將上一步得到的頭文件加入到此工程中,根據頭文件編寫相應方法的實現代碼。通常動態鏈接庫只在本地方法執行時才需要加載,因此在本地方法所在的類中加入static代碼塊去加載動態鏈接庫即可[1]。

1.2 為什么要使用動態鏈接庫

在應用程序開發過程中,一個用戶源程序變為一個可在內存中執行的程序的步驟,需要經歷編譯、鏈接、裝入三個主要過程。編譯是將源文件編譯為一個或多個目標模塊,鏈接是將標準代碼同使用的函數的目標代碼以及一些標準的啟動代碼組合起來生成程序的運行階段版本,裝入是將可執行文件載入內存中。

首先C/C++的產物是源文件編譯產生的目標文件,由于這些文件沒有經過鏈接,不能使用任何外部的函數或功能,這類文件對于Java程序也就沒有任何作用。這些文件在經過鏈接之后,會變成可執行文件、靜態庫或動態庫。由于可執行文件并不對外提供函數訪問入口,因此它也不是JNI使用的目標。靜態庫的使用需要將庫中的二進制碼和客戶端代碼合并到一起,但是字節碼和二進制碼有天然的差異性,難以合并到一起。經過一系列排除,JNI只能通過調用動態鏈接庫中的函數完成本地調用[2]。

2? ?接口設計與JNI對象訪問

2.1 接口設計

在運維環境中,磁盤空間、CPU占用和內存占用是系統運行中最重要的三個指標,本文就針對這三項指標進行接口設計。其中磁盤信息主要包括盤符、驅動器類型、總驅動器空間和可用空間。進程信息主要包括進程ID、內存占用和CPU使用率。其中getDiskInfo用于一次性獲取所有的驅動器信息,getProcessInfo根據進程ID獲取進程的運行信息。因為進程在每次啟動之后,通常會產生進程ID,所以通過進程ID獲取進程信息對外提供的功能依然有限。雖然進程ID經常變化,但是進程名稱通常不會變化,因此設計getProcessId方法用于根據進程名稱獲取進程ID。

public class SystemInfoUtils {

public static native DriveInfo[] getDiskInfo(); // 獲取本地磁盤信息

public static native int getProcessId(String processName); // 根據名稱獲取進程ID

public static native ProcessInfo getProcessInfo(int processId); // 根據進程ID獲取進程信息

}

2.2 JNI對象訪問

雖然在C/C++代碼中,主要是按照C/C++的語言特性進行代碼開發的,因為需要實現Java的方法,那就避免不了C/C++變量和Java類型變量的轉換和操作。Java中的類型分為基本類型和對象類型兩大類,前者Java提供了對C/C++的直接類型映射,后者則需要通過一系列對象操作完成訪問。其中,Java對象訪問可以分為對象類型訪問、對象域訪問、靜態域訪問、靜態方法訪問和對象方法訪問。在使用javah生成的頭文件中,本地方法映射到的C/C++函數聲明的第一個參數都是JNIEnv類型的指針變量,這個數據結構的元素指向JVM產生的矩陣的指針,矩陣中的每一個元素指向一個Java預定義的函數。使用這些函數就可以完成對對象的各種訪問。

3? ?DDL開發

3.1 磁盤信息讀取

磁盤信息的讀取主要就是WindowsAPI和JNI的使用過程,使用GetLogicalDriveStringsW函數可以獲取一個NULL結尾的字符串,這個字符串中每一個字符對應系統中的一個有效驅動器。該函數的第二個參數需要先開辟一個字符數組作為緩沖區用于接收“NULL結尾的字符串”,為了防止數組訪問越界,還需要使用第一個參數告知該字符數組的長度。如果函數訪問成功,返回值就是復制到緩沖區的字符串的長度。這里獲取到的有效驅動器是指Windows支持的各種驅動,不僅包括磁盤驅動器,還包括光盤,軟盤等驅動器。可以通過GetDriveType函數獲取驅動器的類型,其中輸入參數是驅動器的根目錄,返回值是驅動器的類型。其中最常見的光盤驅動器DRIVE_CDROM和磁盤驅動器類型DRIVE_FIXED,更多類型可以參考Win32API的官方文檔[3]。

使用GetDiskFreeSpace函數可以檢索有關指定磁盤的信息,包括磁盤上的可用空間量。其中第一個輸入參數是驅動器的根目錄,其余四個分別用于接收簇上的扇區數、扇區中的字節數、磁盤上空閑的簇數和磁盤上總的簇數。根據這些指標就可以計算出這塊磁盤總的空間大小和可用空間大小。其中,塊(Block)/簇(Cluster)是磁盤管理中的邏輯概念,扇區是磁盤最小的物理存儲單元,但由于操作系統無法對數目眾多的扇區進行尋址,所以操作系統就將相鄰的扇區組合在一起,形成一個簇,然后再對簇進行管理。

3.2 進程管理

使用OpenProcess函數可以根據進程ID打開進程的句柄。句柄是Windows編程的一個基礎,可以用來標志應用程序中的不同對象和同類對象中的不同的實例。該函數的第一個參數是進程訪問權限,第二個參數是所得到的進程句柄是否可以被繼承,第三個參數是被打開進程的ID。在取得進程的句柄之后,可以通過GetProcessMemoryInfo檢索有關指定進程的內存使用情況的信息。參數1是被訪問的目標進程的句柄,來自于之前OpenProcess函數的返回值。另外兩個參數分別是輸出結構和輸出結構變量的大小,輸出結構接收了進程內存使用情況的信息,其中當前工作集大小WorkingSetSize就是目標進程占用的內存大小,用字節表示。

CPU作為計算機中最重要的計算資源,其資源分配取決于操作系統使用的調度算法。對于不同的系統和系統目標,通常采用不同的調度算法,在Windows中主要采用基于時間片的輪轉式進程調度算法。這種調度算法,在早期采用的是簡單的時間片輪轉法,進入20世紀90年代后,開始采用多級反饋隊列調度算法。在Windows系統中,CPU的使用率類似于車輛的速度,是一段時間內進程使用CPU時間在這段時間內的占比。WindowsAPI沒有直接提供CPU使用率的獲取函數,但是提供了GetProcessTimes函數用于獲取進程,從運行開始后,在內核模式下執行的時間量和在用戶模式下執行的時間量[4]。

在Windows操作系統下有用戶模式和內核模式兩種模式,根據處理器上運行的代碼的類型,處理器在兩個模式之間切換。應用程序在用戶模式下運行,核心操作系統組件在內核模式下運行。進程在兩種模式的執行時間總量就是進程CPU的使用時間。通過在不同的時間點,兩次獲取進程CPU使用時間的差就是進程在這段時間內使用的CPU時間,這個CPU時間在這段時間內的占比就可以被認為是CPU的使用率。此外,多核處理器在現代計算機中基本上是標配,GetProcessTimes函數獲取的結果是進程在所有核心上的使用時間總量,所以最終結果還需要按核心數做平均值[5]。

最后根據名稱獲取進程的ID,使用EnumProcesses函數可以遍歷當前系統中每個進程的進程標識符,然后再通過EnumProcessModules獲取進程的名稱,最后通過wcscmp比對程序名稱就可以獲取進程ID[6]。

int getCpuUsageRate(HANDLE hProcess) {

int cpu_num = get_processor_number();

FILETIME now;

GetSystemTimeAsFileTime(&now);

DWORD start = FileTimeToInt64(now);

DWORD used = (FileTimeToInt64(ker) + FileTimeToInt64(user));

Sleep(200);

GetSystemTimeAsFileTime(&now);

DWORD end = FileTimeToInt64(now);

DWORD used1 = (FileTimeToInt64(ker1) + FileTimeToInt64(user1));

return (used1 - used) * 100 / cpu_num / (end - start);

}

4? ?結束語

本文圍繞在Java中使用本地方法這一課題進行研究和思考,結合工程中常見的問題與相關理論進行技術設計和實現。現在社會的發展方向就是信息化和智能化,隨著移動互聯網的興起,手機系統在人們生活中扮演著越來越重要的角色。作為現代社會最具時代特點的智能終端,想要充分發揮其硬件性能,不可避免地需要本地代碼驅動硬件,因此在安卓系統中JNI同樣扮演著重要角色。JAVA的應用范圍雖然在不斷擴大,但是很多用戶僅僅從程序設計的語言方面了解JAVA。所以現在加強用戶對JAVA技術的認知是擴大JAVA的適用范圍的手段之一,也可為人們提供一個更加安全、更加簡便的計算機程序,為我國的計算機信息產業發展做出貢獻。■

參考文獻

[1] Cay S.Horstmann.Java核心技術[M].北京:機械工業出版社,2017.

[2] 湯小丹.計算機操作系統[M].西安:西安電子科技大學出版社,2007.

[3] Charles Petzold.Windows程序設計[M].北京:清華大學出版社,2010.

[4] 楊文超.Java虛擬機內存管理與優化策略[J].電子測試,2013(10):43-44,62.

[5]李卓恒.JAVA虛擬機相關技術研究與實踐[J].科技創新導報,2018(1):156,158.

[6] 許曉寧.Java_Native_Interface應用研究[J].計算機科學,2006(10):291-292.

主站蜘蛛池模板: 亚洲成人在线网| 朝桐光一区二区| 国产精品视频999| 国产成人精品优优av| 成人伊人色一区二区三区| 亚洲一区无码在线| 亚洲国产综合第一精品小说| 国产精品自在在线午夜区app| 在线观看无码av免费不卡网站| 亚洲熟女中文字幕男人总站| 国产91小视频在线观看| 无码AV日韩一二三区| 久久婷婷六月| 成人一区专区在线观看| 亚洲欧洲日产国码无码av喷潮| 欧美一区中文字幕| 人妻21p大胆| 亚洲第一极品精品无码| www亚洲精品| 久久国产毛片| 亚洲欧美日韩久久精品| 日韩天堂在线观看| 国产精品熟女亚洲AV麻豆| 色视频久久| 永久免费av网站可以直接看的| 丰满的熟女一区二区三区l| 亚洲综合色婷婷中文字幕| 国产亚洲精久久久久久无码AV| 人人爽人人爽人人片| 精品视频一区二区观看| 国产va免费精品观看| 日韩精品一区二区三区视频免费看| 无码高潮喷水专区久久| 在线欧美日韩| 四虎影视8848永久精品| 无套av在线| 亚洲成人一区二区三区| 国产特级毛片aaaaaaa高清| 国产一级妓女av网站| 亚洲成a人在线观看| 91久久夜色精品| 久久综合丝袜日本网| 波多野结衣一区二区三区四区| 亚洲Av综合日韩精品久久久| 国产亚洲精品自在线| 国产真实自在自线免费精品| 久久亚洲国产最新网站| 成人蜜桃网| 日本成人不卡视频| 超碰精品无码一区二区| 青青青亚洲精品国产| 亚洲成a人片7777| 97视频免费在线观看| 日韩欧美国产综合| 久久精品人人做人人| 国产精品久久久久婷婷五月| 亚洲中文字幕国产av| 992tv国产人成在线观看| 丰满少妇αⅴ无码区| 亚洲天堂免费在线视频| 喷潮白浆直流在线播放| 精品综合久久久久久97| 91年精品国产福利线观看久久 | 国产欧美在线| 精品视频一区在线观看| 91精品网站| 中文字幕资源站| 日韩精品成人在线| 国内精品免费| 国产黑丝一区| 免费又爽又刺激高潮网址 | 2024av在线无码中文最新| 亚洲Av综合日韩精品久久久| 久久久久国产一级毛片高清板| 农村乱人伦一区二区| 蜜臀AV在线播放| www.国产福利| 欧美日韩免费| 成色7777精品在线| 久久伊伊香蕉综合精品| 青青青伊人色综合久久| 成人免费黄色小视频|