jnijava的簡單介紹

本文目錄一覽:

淺談如何用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-tw/n/134073.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
CATV的頭像CATV
上一篇 2024-10-04 00:03
下一篇 2024-10-04 00:03

相關推薦

  • Python簡單數學計算

    本文將從多個方面介紹Python的簡單數學計算,包括基礎運算符、函數、庫以及實際應用場景。 一、基礎運算符 Python提供了基礎的算術運算符,包括加(+)、減(-)、乘(*)、除…

    編程 2025-04-29
  • Python滿天星代碼:讓編程變得更加簡單

    本文將從多個方面詳細闡述Python滿天星代碼,為大家介紹它的優點以及如何在編程中使用。無論是剛剛接觸編程還是資深程序員,都能從中獲得一定的收穫。 一、簡介 Python滿天星代碼…

    編程 2025-04-29
  • Python海龜代碼簡單畫圖

    本文將介紹如何使用Python的海龜庫進行簡單畫圖,並提供相關示例代碼。 一、基礎用法 使用Python的海龜庫,我們可以控制一個小海龜在窗口中移動,並利用它的「畫筆」在窗口中繪製…

    編程 2025-04-29
  • Python櫻花樹代碼簡單

    本文將對Python櫻花樹代碼進行詳細的闡述和講解,幫助讀者更好地理解該代碼的實現方法。 一、簡介 櫻花樹是一種圖形效果,它的實現方法比較簡單。Python中可以通過turtle這…

    編程 2025-04-28
  • Python大神作品:讓編程變得更加簡單

    Python作為一種高級的解釋性編程語言,一直被廣泛地運用於各個領域,從Web開發、遊戲開發到人工智慧,Python都扮演著重要的角色。Python的代碼簡潔明了,易於閱讀和維護,…

    編程 2025-04-28
  • 用Python實現簡單爬蟲程序

    在當今時代,互聯網上的信息量是爆炸式增長的,其中很多信息可以被利用。對於數據分析、數據挖掘或者其他一些需要大量數據的任務,我們可以使用爬蟲技術從各個網站獲取需要的信息。而Pytho…

    編程 2025-04-28
  • 如何製作一個簡單的換裝遊戲

    本文將從以下幾個方面,為大家介紹如何製作一個簡單的換裝遊戲: 1. 遊戲需求和界面設計 2. 使用HTML、CSS和JavaScript開發遊戲 3. 實現遊戲的基本功能:拖拽交互…

    編程 2025-04-27
  • Guava Limiter——限流器的簡單易用

    本文將從多個維度對Guava Limiter進行詳細闡述,介紹其定義、使用方法、工作原理和案例應用等方面,並給出完整的代碼示例,希望能夠幫助讀者更好地了解和使用該庫。 一、定義 G…

    編程 2025-04-27
  • 2的32次方-1:一個看似簡單卻又複雜的數字

    對於計算機領域的人來說,2的32次方-1(也就是十進位下的4294967295)這個數字並不陌生。它經常被用來表示IPv4地址或者無符號32位整數的最大值。但實際上,這個數字卻包含…

    編程 2025-04-27
  • 製作一個簡單的管理系統的成本及實現

    想要製作一個簡單的管理系統,需要進行技術選型、開發、測試等過程,那麼這個過程會花費多少錢呢?我們將從多個方面來闡述製作一個簡單的管理系統的成本及實現。 一、技術選型 當我們開始思考…

    編程 2025-04-27

發表回復

登錄後才能評論