1. 程式人生 > >Jni程式設計(一)內容簡介以及helloworld

Jni程式設計(一)內容簡介以及helloworld

寫在開端的話語:

從今天開始我將書寫一系列的關於jni程式設計的從入門到熟練的部落格(精通不敢說,哈哈),一個是為了記錄自己的學習歷程,怕自己忘記,另一個也是想把自己的學習成果向大家分享一下啊。當然學習這個之前你要有c/c++的基礎才行(不會的話還是自己先學一下),要不然你會一臉懵逼。後面我會分享一些關於 jni實戰的demo,包括jni處理gif動畫,視訊編解碼,加水印等等(因為我是做Android開發的所以後面的實戰主要還是以app的形式來學習 。由於前面主要是學習jni的一些規範,因為Android stuido比較的耗記憶體(取決於電腦的效能),編譯時間也慢,為了快速學習jni的規範,所以我們採用elipse+visual studio 

編譯處dll的方式 這也有利於我們快速的學習和除錯。每一篇部落格儘量的短,俗話說,濃縮的才是精華,因為太長了看著也費勁,我寫著也費勁,儘量寫的簡明扼要。

一、jni簡介

●Java是跨平臺的語言,但是在有些時候仍然是有需要呼叫原生代碼(這些程式碼通常是由C/C++編寫的)

●Sun公司提供的JNI是Java平臺的一個功能強大的介面,這個JNI介面提供了Java與作業系統原生代碼互相呼叫的功能。

二、JNIEnv ,jobject ,jclass

1. JNIEnv類實際代表了Java環境,通過這個JNIEnv* 指標,就可以對Java端的程式碼進行操作。例如,建立Java類的物件,呼叫Java物件的方法,獲取Java物件的屬性等等,JNIEnv的指標會被JNI傳入到本地方法的實現兩數中來對Java端的程式碼進行操作。

JNIEnv類中有很多函式用可以用

1.NewObject/NewString/New<TYPE>Array
2.Get/Set<TYPE>Field
3.Get/SetStatic<TYPE>Field
4.Call<TYPE>Method/CallStatic<TYPE>Method等許許多多的函式

2. jobject代表了在java端呼叫本地c/c++程式碼的那個類的一個例項(物件)。在修改和呼叫java端的屬性和方法的時候,用jobject 作為引數,代表了修改了jobject所對應的java端的物件的屬性和方法(具體理解可以參考下面的例子)

3. jclass : 為了能夠在c/c++中使用java類JNI.h標頭檔案中專門定義了jclass型別來表示java中的Class類

JNIEvn中規定可以用以下幾個函式來取得jclass

1.jclass FindClass(const char* clsName) ;
2.jclass GetObjectClass(jobject obj);
3.jclass GetSuperClass(jclass obj);