2013-10-25 39 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);