字符串

從java程序中傳過去的String對象在本地方法中對應的是jstring類型,jstring類型和c中的char*不一樣,因此若是你直接當 作char*使用的話,就會出錯。所以在使用以前須要將jstring轉換成爲c/c++中的char*,這裏使用JNIEnv的方法轉換.java

下面是訪問String的一些方法:
GetStringUTFChars將jstring轉換成爲UTF-8格式的char*
GetStringChars將jstring轉換成爲Unicode格式的char*
ReleaseStringUTFChars釋放指向UTF-8格式的char*的指針
ReleaseStringChars釋放指向Unicode格式的char*的指針
NewStringUTF建立一個UTF-8格式的String對象
NewString建立一個Unicode格式的String對象
GetStringUTFLengt獲取 UTF-8格式的char*的長度 
GetStringLength獲取Unicode格式的char*的長 度c++

 

JNI 支持字符串在 Unicode 和 UTF-8 兩種編碼之間轉換。函數

複製代碼

JNIEXPORT jstring JNICALL  Java_Prompt_getLine(JNIEnv *env, jobject obj, jstring prompt) 
 { 
     char buf[128]; 
     const jbyte *str; 
     str = (*env)->GetStringUTFChars(env, prompt, NULL); 
     if (str == NULL) { //不要忘記檢測,不然分配內存失敗會拋出異常
         return NULL; /* OutOfMemoryError already thrown */ 
     } 
     printf("%s", str); 
     (*env)->ReleaseStringUTFChars(env, prompt, str); 
     
     /* We assume here that the user does not type more than  * 127 characters */ 
     scanf("%s", buf); 
     return (*env)->NewStringUTF(env, inbuf); 
}

複製代碼

(1)GetStringUTFChars能夠把一個 jstring指針(指向JVM內部的Unicode字符序列)轉化成一個UTF-8格式的C 字符串。
(2)從GetStringUTFChars 中獲取的UTF-8字符串在本地代碼中使用完畢後,要使用ReleaseStringUTFChars 告訴 JVM 這個 UTF-8 字符串不會被使用了,由於這個UTF-8字符串佔用的內存會被回收。
(3)JNI 函數 NewStringUTF 在本地方法中建立一個新的java.lang.String字符串對象.這個新建立的字符串對象擁有一個與給定的
UTF-8編碼的C類型字符串內容相同的 Unicode 編碼字符串編碼

UTF-8 字符串以’\0’結尾,而 Unicode 字符串不是。
若是一個jstring指向一個 UTF-8編碼的字符串,爲了獲得這個字符串的字節長度,能夠調用標準 C 函數 strlen,固然也能夠用GetStringUTFLengthspa

GetStringChars 和 GetStringUTFChars 函數中的第三個參數須要更進一步的解釋:
const jchar * GetStringChars(JNIEnv *env, jstring str, jboolean *isCopy);指針

當從 JNI 函數 GetStringChars 中返回獲得字符串B時,若是B是原始字符串java.lang.String 的拷貝,則isCopy被賦值爲 JNI_TRUE。
若是B和原始字符串指向的是JVM中的同一份數據,則 isCopy被賦值爲 JNI_FALSE。
當 isCopy值爲JNI_FALSE時,本地代碼決不能修改字符串的內容,不然JVM中的原始字符串也會被修改,這會打破 JAVA語言中字符串不可變的規則。
一般,由於你沒必要關心 JVM 是否會返回原始字符串的拷貝,你只須要爲 isCopy傳遞NULL做爲參數。code

相關文章
相關標籤/搜索