本文目錄一覽:
- 1、淺談如何用JNI的代碼調用java接口
- 2、如何用JNI技術提高Java的性能詳解
- 3、jni調用 java和c是同個線程嗎
- 4、jni調用java的private方法
- 5、Java開發中什麼情況下要用到JNI技術
- 6、用Java的JNI技術技術調用C++,C++運行效率會不會比單獨運行時慢?
淺談如何用JNI的代碼調用java接口
對於本地函數
JNIEXPORT void JNICALL Java_video1_TestNative_sayHello(JNIEnv * env, jobject obj)
{
cout”Hello Native Test !”endl;
}
JNIEnv類型代表Java環境。通過這個JNIEnv*指針,就可以對Java端的代碼進行操作。如,創建Java類得對象,調用Java對象的方法,獲取Java對象的屬性等。
JNIEnv的指針會被JNI傳送到本地方法的實現函數中來對Java端的代碼進行操作
JNIEnv類中的函數:
NewObject/NewString/NewTYPEArray :new新對象
Get/SetTYPEField:獲取屬性
Get/SetStaticTYPEField :獲取靜態屬性
CallTYPEMethod/CallStaticTYPEMethod
如何用JNI技術提高Java的性能詳解
阻礙Java取得廣泛使用的一個首要因素是Java程序的運行效率。Java是介於解釋型和編譯型之間的一種語言,同樣的程序,假如用編譯型語言C來實現,其運行速度通常要比Java快一倍以上。Java具有平台無關性,這使人們在開發企業級使用的時刻總是把它作為首要候選方案之一,但是性能方面的因素又大大削弱了它的競爭力。為此,提高Java的性能就顯得十分主要。 疑問的提出 Sun公司及Java的支撐者們為提高Java的運行速度已經做出了許多全力,其中大多數集中在程序設計的要領和模式挑選方面。由於算法和設計模式的優化是通用的,對Java有效的優化算法和設計模式,對其他編譯語言也基本同樣適用,因此無法從根本上改動 Java程序與編譯型語言在執行效率方面的差別。 JIT(Just In Time,及時編譯)技能是個比較好的思想。它的基本原理是:最先議決 Java編譯器把Java源代碼編譯成平台無關的二進制字節碼。然後在Java程序真實執行之前,系統議決 JIT編譯器把Java的字節碼編譯為本地化機器碼。結尾,系統執行本地化機器碼,節省了對字節碼實行解釋的時間。這樣做的優點是大大提高了Java程序的性能,縮短了加載程序的時間;同時,由於編譯的結果並不在程序運行間保存,因此也節約了存儲空間。缺點是由於JIT編譯器對所有的代碼都想優化,因此同樣也佔用了許多時間。 動態優化技能是提高Java性能的另一個嘗試。該技能試圖議決把Java源程序直接編譯成機器碼,以充分使用 Java動態編譯和靜態編譯技能來提高Java的性能。該要領把輸入的Java源碼或字節碼轉換為經歷高度優化的可執行代碼和動態庫 (Windows中的. dll文件或Unix中的. so文件)。該技能能大大提高程序的性能,但卻破壞了Java的可移植性。 JNI技能 實際上,有一種通常為咱們忽視的技能能夠在很大程度上處理這個難題,那就是JNI(Java Native Interface, Java本地化要領 )。主張採用純Java的人們通常反對本地化代碼的運用,他們認為在Java程序執行的流程中調用C/C++程序會影響程序的可移植性和安全性。還有一些人認為JNI只是對過去混合編程技能的基本擴展,本來際目標是為了充分使用大量原有的C程序庫。 本來,咱們不必拘泥於嚴格的平台獨立性限定,因為採用JNI技能只是針對一些嚴重影響Java性能的代碼段,該部分可能只佔源程序的極少部分,所以幾乎能夠不思慮該部分代碼在主流平台之間移植的工作量。同時,也不必過分擔心類型匹配疑問,咱們完全能夠控制代碼不出現這種不正確。此外,也不必擔心安全控制疑問,因為Java安全模型已擴展為準許非系統類加載和調用本地點法。根據Java規範,從JDK 1. 2開始,FindClass將設法找到與當前的本地點法關聯的類加載器。假如平台有關代碼屬於一個系統類,則無需涉及任何類加載器; 否則,將調用適當的類加載器來加載和鏈接已命名的類。換句話說,假如在Java程序中直接調用C/C++語言產生的機器碼,該部分代碼的安全性就由Java虛擬機控制。
jni調用 java和c是同個線程嗎
是的,jni調用時, java和c是同個線程。
檢測方法:在java和c中分別把當前線程的id輸出出來查看。
Java獲取線程Id:
Thread.currentThread().getId();
C中獲取線程Id:
GetCurrentThreadId();
jni調用java的private方法
jni調用java的public native修飾的方法
可以把調用jni的方法和要訪問的private方法,封裝到一個方法里,觸發事件時,其實是實用這個封裝好的方法。
Java開發中什麼情況下要用到JNI技術
JNI可以使Java代碼和本地的C/C++代碼進行交互。
為什麼要使用JNI技術:
java無法直接操作硬件, c/c++可以操作硬件,並且效率較高。
java在視頻處理,遊戲渲染等方面效率不及c/c++。
避免重複造輪子, 有大量優秀的庫,可以復用。
例如:java圖形界面程序在最小化後,無法獲取全局的鍵盤和鼠標事件. 需要JNI實現全局熱鍵功能 . java里獲取其他窗口的句柄, 並對其他窗口進行控制,也需要JNI技術.
使用了JNI技術缺點是會導致無法跨平台。 需要根據其他平台,再開發本地代碼。
JNI實現起來有點複雜. 所以有了JNA技術, 雖然JNA很強大,但是很多功能還是需要JNI來實現的
用Java的JNI技術技術調用C++,C++運行效率會不會比單獨運行時慢?
這要取決於在方法中執行的語句,如果只是作一些簡的操作,調用C/C++代碼反而會拉低效率,如果是比較複雜的一些運算如圖像處理變換等,C/C++代碼效率更高。
java中引入jni技術的原由是由於java的運行效率較低,當遇到處理圖像聲音等需要大量運算的操作時,java力不從心。所以引入執行效率較高的C/C++代碼供java調用,以彌補java的這一缺陷。
jni雖然一定程度上能夠提高效率,但要慎用,適當用。如果只作簡單的加法,卻用jni效率反而大大降低。並且jni會影響java的跨平台性和穩定性。
原創文章,作者:CATV,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/134073.html