從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