成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java無法編寫?通過JNI本地編寫來解決

開發(fā) 后端
通過JNI編寫本地方法來解決Java無法使用問題。本文講述了通過JNI工作原理,在標(biāo)準(zhǔn)Java類庫并不支持的依賴于平臺的特色或者程序庫的時候,通過JNI來編寫本地方法,解決一個程序無法完全使用Java編寫的問題。

51CTO曾經(jīng)給網(wǎng)友們推薦過“Java通過JNI調(diào)用C語言的方法”等文章,用來解決Java無法編寫的問題。在您的程序中使用JNI并不是一件容易的事情,然而,JNI的性能和使用原有代碼的能力將會為您的Java程序添加更多的功能并且能勝任更多的挑戰(zhàn)。

Java本地接口(JNI——Java Native Interface)允許運(yùn)行在Java虛擬機(jī)(JVM——Java Virtual Machine)上的代碼調(diào)用本地程序和類庫,或者被它們調(diào)用,這些程序和類庫可以是其它語言編寫的,比如C、C++或者匯編語言。當(dāng)一個程序無法完全使用Java編寫時,開發(fā)者可以通過JNI來編寫本地方法,比如標(biāo)準(zhǔn)Java類庫并不支持的依賴于平臺的特色或者程序庫。JNI還可以用于修改現(xiàn)有的使用其它語言編寫的程序,使它們可以通過Java編寫的程序來訪問。很多基本類庫都依賴JNI來為開發(fā)者和用戶提供服務(wù),比如文件的輸入/輸出和音頻功能。在基本類庫中包含的對于性能和平臺敏感的API可以允許所有的Java程序以安全和平臺無關(guān)的方式來使用這些功能,在采用JNI之前,開發(fā)者需要明確這些功能并不是已經(jīng)包含在Java標(biāo)準(zhǔn)類庫中的,在這篇文章中,我將會講解JNI是如何工作的以及本地類型是如何映射到Java的類型和類庫的。

JNI工作原理

在JNI中,本地函數(shù)是通過一個獨(dú)立的.c或.cpp文件來實(shí)現(xiàn)的(C++為JNI提供的界面會更簡潔一些)。當(dāng)JVM調(diào)用該函數(shù)時,它傳遞了一個JNIEnv指針、一個jobject指針和通過Java方法定義的Java參數(shù),JNI函數(shù)的形式如下:

  1.  JNIEXPORT void JNICALL   
  2. Java_ClassName_MethodName  (JNIEnv *env, jobjectobj)   
  3. {   
  4. //Method native implemenation  

env指針是一個包含了JVM接口的結(jié)構(gòu),它包含了與JVM進(jìn)行交互以及與Java對象協(xié)同工作所必需的函數(shù),示例中的JNI函數(shù)可以在本地?cái)?shù)組和Java數(shù)組類型之間、本地字符串和Java字符串類型之間進(jìn)行轉(zhuǎn)換,其功能還包括對象的實(shí)例化、拋出異常等。基本上您可以使用JNIEnv來實(shí)現(xiàn)所有Java能做到的事情,雖然要簡單很多。更加正式的解釋是這樣的,本地代碼通過調(diào)用JNI的函數(shù)來訪問JVM,這是通過一個界面指針實(shí)現(xiàn)的(界面指針實(shí)際上是指向指針的指針),該指針指向一個指針數(shù)組,數(shù)組中的每個指針都指向了一個界面函數(shù),而每個界面函數(shù)都是在數(shù)組中預(yù)先定義過的。本地方法將JNI界面指針當(dāng)作一個參數(shù),如果在同一個Java線程中,出現(xiàn)對該本地方法的多重調(diào)用,JVM則保證傳遞相同的界面指針到本地方法。不過,一個本地方法可以被不同的Java線程調(diào)用,因而也可能會收到不同的JNI界面指針。

本地方法是通過System.loadLibrary方法加載的,在以下的例子中,類的初始化方法加載了一個指定平臺的本地類庫,該類庫定義了本地方法:

  1.  packagepkg;    
  2. class Cls   
  3. {   
  4. native double f(inti, String s);   
  5. static   
  6. {    
  7. System.loadLibrary(pkg_Cls");   
  8. }   

System.loadLibrary方法的參數(shù)是一個類庫的名稱,它可以由程序員任意選取,系統(tǒng)則遵循一個標(biāo)準(zhǔn)的本地化平臺的方式來轉(zhuǎn)換類庫的名稱到一個本地類庫的名稱。例如,在Solaris操作系統(tǒng)中會將pkg_Cls轉(zhuǎn)換為libpkg_Cls.so,而Win32系統(tǒng)則會將同樣的pkg_Cls轉(zhuǎn)換為pkg_Cls.dll。

動態(tài)指針會根據(jù)它們的名字來進(jìn)行解析,一個本地方法的名稱是按照組件進(jìn)行連接的,它包含了:前綴“Java_”、一個分離的合法的類名稱和一個分離的方法名稱。注意:微軟的JVM有相同的機(jī)制從Java調(diào)用本地Windows代碼,該機(jī)制被稱為原始本地接口(Raw Native Interface (RNI))。基本類型,比如整型、字符等等,是在Java和本地代碼間進(jìn)行拷貝的,而其他的自定義Java對象則是通過引用來傳遞的。這個表格展示了Java和本地代碼之間的類型映射,這些類型是可以互換的,您可以在您使用int類型的位置使用jint類型,當(dāng)然反過來也一樣,而且不需要任何類型轉(zhuǎn)化。但是,Java的字符串和數(shù)組類型和本地的字符串與數(shù)組類型之間的轉(zhuǎn)換就比較困難了,如果您使用的jstring類型中出現(xiàn)了字符“*”,您的代碼會造成JVM的崩潰,以下的例子說明了您應(yīng)當(dāng)如何正確使用字符串:

  1.  JNIEXPORT void JNICALL   
  2. Java_ClassName_MethodName   
  3. (JNIEnv *env, jobjectobj, jstringjavaString)   
  4. {    
  5. //Get the native string from   
  6. Java string  const char   
  7. *nativeString =   
  8. env->GetStringUTFChars(env,javaString, 0);   
  9. printf("%s", nativeString);    
  10. env->ReleaseStringUTFChars(env,javaString, nativeString);   

您需要使用界面指針env來操作Java對象。

【編輯推薦】

  1. Java通過JNI調(diào)用C語言的方法
  2. Java JNI深度分析與實(shí)踐
  3. JNI對象在函數(shù)調(diào)用中的生命周期
  4. Java: JNI完全手冊
責(zé)任編輯:佚名 來源: 賽迪網(wǎng)
相關(guān)推薦

2020-12-28 06:29:31

Bash互動游戲Linux

2021-01-12 06:42:50

Lua腳本語言編程語言

2022-06-03 16:59:13

編程語言Awk

2022-03-10 14:57:35

ArkUIets項(xiàng)目開發(fā)鴻蒙

2010-01-14 13:51:03

2012-03-15 13:36:51

云計(jì)算JavaSpring框架

2019-10-08 15:27:18

掃雷BashLinux

2009-05-13 10:29:01

存儲過程OracleJava

2022-03-17 16:04:16

Text文本組件Button組件Column

2023-01-13 18:55:09

游戲Ada編程語言

2023-02-10 09:33:27

2022-03-14 15:36:34

Row容器組件Column容器組件鴻蒙

2011-06-08 09:19:26

Android JNI

2009-06-19 16:55:47

JNI調(diào)用C語言

2025-05-30 01:11:11

JavaPairTriple

2023-09-11 11:05:49

軟件開發(fā)TDD

2013-09-18 09:21:00

NoSQLCouchbase LCouchbase

2021-01-03 16:30:34

Rust編程語言

2011-11-18 09:42:29

Ajax

2010-01-15 18:46:08

C++程序代碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 欧美日韩国产精品激情在线播放 | 日韩精品在线一区二区 | 日韩欧美福利视频 | 91国产在线视频在线 | 午夜影院操| 成人深夜福利 | 免费亚洲婷婷 | 日韩午夜场 | 欧美精品久久久 | 狠狠热视频 | 欧美日韩国产精品一区 | 精品国产一区二区在线 | 亚洲精品无 | 91色视频在线观看 | 黑人性hd | 女生羞羞网站 | www.youjizz.com日韩 | av一二三区| 人人人人干 | 欧美一级小视频 | 久久精品国产一区 | 国产精品一区二区在线免费观看 | 欧美在线视频免费 | 国产做a爱免费视频 | 羞羞的视频在线观看 | 男女羞羞视频免费看 | 国产视频二区在线观看 | 国产高清精品在线 | 久久亚洲国产 | 请别相信他免费喜剧电影在线观看 | 国产精品久久久久久久久久久久久久 | 视频一区二区中文字幕日韩 | 久久精品成人一区 | 久久亚洲一区 | 免费在线一区二区 | 国产成人av在线播放 | 久久久久久久综合 | 国产黄视频在线播放 | 亚洲视频精品 | 在线一区| 精品国产一二三区 |