Android JNI開發摘錄(一)之JNI串處理

Java本機接口

      JNI提供許多函數,例如串和數組的處理,以及創建和使用Java對象的一個完整函數集。這些函數都使用一個指向Java環境的指針作爲第一個參數。然而爲了簡化編程,這些函數都在JNIEnv結構中定義了一個別名。這就意味着可以通過指向Java環境的指針JNIEnv來調用任意的JNI函數。以下依次介紹JNIEnv結構中定義的函數。

    NDK編譯命令:$NDK/ndk-build -C [Project Path]      如:$NDK/ndk-build -C D:/Android/MyProject

    獲取方法和變量描述符的編譯命令:javap -s -classpath . [PacketName+"."+Library Name]  如:javap -s -classpath . com.example.MyProject.MyLibrary

    編譯JNI頭文件的命令:javah -classpath .  [PacketName+"."+Library Name]  如:javah -classpath .  com.example.MyProject.MyLibrary

     一. 數據類型

    JNI環境中使用的數據類型稱爲本機類型,下面是基本類型和本機類型的對應關係表。

基本類型   本機類型   長度/bit  

boolean   jboolean   8,無符號(1Byte)  

byte      jbyte      8  

char      jchar      16  

short     jshort     16  

int       jint       32  

long      jlong      64  

float     jfloat     32  

double    jdouble    64  

void      void       n/a  

     二. JNI中的串處理函數

    1.新建jstring

1 jstring NewString(const jchar *unicodeChars, jsize len);//創建Unicode格式的jstring串

3 jstring NewStringUTF(constchar *bytes); //創建UTF-8格式的jstring串


   2.獲取字符串長度


jsize GetStringLength(jstring string);//Unicode

jsize GetStringUTFLength(jstring string);//UTF-8


   3.jstring轉化爲C串及釋放jstring串


/**

*如果生成串的一個副本,isCopy參數將被置爲JNI_TRUE,否則置爲

*NULL或者JNI_FALSE

*/

const jchar* GetStringChars(jstring string, jboolean *isCopy);

const char* GetStringUTFChars(jstring string, jboolean *isCopy );

    注:這兩個函數返回一個指向特定jstring中字符順序的指針,該指針保持有效直到下面的函數被調用:


void ReleaseStringChars(jstring string, const jchar *chars);

void ReleaseStringUTFChars(jstring string, constchar *utf);

    GetStringRegion函數將串str的一個子串傳送到一個字符緩存器。該子串在位置start處開始,在len-1處結束(這樣傳送的字符數就是len)。這將會拋出一個StringIndexOutOfBoundsException:

void GetStringRegion(jstring str, jsize start, jsize len, jchar *buf);

void GetStringUTFRegion(jstring str, jsize start, jsize len, char *buf);

   

GetStringCritical函數返回一個指向特定串中字符的指針。如果有必要,複製該字符,並且函數返回時將isCopy置爲JNI_TRUE,否則置爲NULL或JNI_FALSE。在調用該函數後,直至調    用ReleaseStringCritical之前,所使用的所有函數都無法使當前線程被阻塞:


const jchar* GetStringCritical(jstring string, jboolean *isCopy);

void ReleaseStringCritical(jstring string,const jchar *carray);


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章