2013-10-25 80 views
3

美好的一天,我試圖使用JNI將Java字符串數組複製到C++數組。我已經嘗試過,但似乎沒有工作。獲取從Java到C++的字符串數組JNI

char *myarray; 

JNIEXPORT void JNICALL 
Java_com_Example_accessArray(JNIEnv *env, jobject obj, jobjectArray stringArrays){ 
     int size; 
     size = env->GetArrayLength(stringArrays); 
    myarray = env->GetCharArrayRegion(stringArrays, 0, size, null); 

} 

myarray是否在傳遞的Java數組中保持相同的值?或者我怎樣才能將通過JNI傳遞的java字符串數組的值複製到C++數組中,所以C++中的數組保持相同的值?提前致謝。

+0

您希望您的字符串位於哪個字符集/編碼(又名「代碼頁」)? Unicode/UTF-16,Unicode/UTF-8,Windows-1252(但可能不是_modified UTF-8_),...? Java字符串是Unicode的,所以如果你想轉換爲另一個字符集,如果目標字符集缺少一個字符,你想要做什麼?使用 '?'或另一個替代品,拋出一個例外,...? –

回答

6

你傳遞一個對象數組,所以你不能從這個數組中獲取字符。 一種方法是這樣的:

int size = env->GetArrayLength(stringArrays); 

for (int i=0; i < size; ++i) 
{ 
    jstring string = env->GetObjectArrayElement(stringArrays, i); 
    const char* mayarray = env->GetStringUTFChars(string, 0); 
    .... do some work or copy it to a c++ array of char*.... 
    env->ReleaseStringUTFChars(string, myarray); 
    env->DeleteLocalRef(string); 
} 
+0

好的答案,但你應該在循環結尾調用'DeleteLocalRef(string)'來避免創建無限數量的對象引用。另外,它應該是'ReleaseStringUTFChars(string,myarray)'。 – pburka

+0

@pburka:你們都對。儘管陣列中元素的數量很少,但它並沒有太大區別,但我也沒有傷害。對於ReleaseString調用來說很好。通常我在使用jni時使用c,然後最後一個參數是iscopy。 – mkaes

1

這是我使用的Java字符串數組String[]轉換爲代碼C++ vector<string>

void Java_com_domain_project_activity_stringArrToStringVector(JNIEnv *env, jobject obj, jobjectArray jstringArr) { 
     vector<string> stringVec; 

     // Get length 
     int len = env->GetArrayLength(jstringArr); 

     for (int i=0; i<len; i++) { 
      // Cast array element to string 
      jstring jstr = (jstring) (env->GetObjectArrayElement(jstringArr, i)); 

      // Convert Java string to std::string 
      const jsize strLen = env->GetStringUTFLength(jstr); 
      const char *charBuffer = env->GetStringUTFChars(jstr, (jboolean *) 0); 
      string str(charBuffer, strLen); 

      // Push back string to vector 
      stringVec.push_back(str); 

      // Release memory 
      env->ReleaseStringUTFChars(jstr, charBuffer); 
      env->DeleteLocalRef(jstr); 
     } 
} 

而且在Java方面的功能會看像下面這樣:

void stringArrToStringVector(String[] jstringArr); 

最後,作爲一個側面說明,從Java字符串列表轉換爲字符串數組(你將PAS s到您的JNI功能),您可以執行以下操作:

List<String> strList = new ArrayList<>(); 
// Populate strList 
String[] strArr = new String[strList.size()]; 
strList.toArray(strArr);