获取从Java到C的字符串数组++;JNI 你好,我尝试用JNI将java字符串数组复制到C++数组。我试过这个,但似乎不起作用 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); }

获取从Java到C的字符串数组++;JNI 你好,我尝试用JNI将java字符串数组复制到C++数组。我试过这个,但似乎不起作用 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); },java,c++,java-native-interface,Java,C++,Java Native Interface,myarray是否在传递的Java数组中保存相同的值?或者我如何复制通过JNI传递到Java C++数组的java字符串数组的值,C++中的数组拥有相同的值?提前感谢。您传递了一个对象数组,因此无法仅从该数组中获取字符。 一种方法是这样的: int size = env->GetArrayLength(stringArrays); for (int i=0; i < size; ++i) { jstring string = env->GetObjectArrayE

myarray是否在传递的Java数组中保存相同的值?或者我如何复制通过JNI传递到Java C++数组的java字符串数组的值,C++中的数组拥有相同的值?提前感谢。

您传递了一个对象数组,因此无法仅从该数组中获取字符。 一种方法是这样的:

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);
}
int size=env->GetArrayLength(stringArrays);
对于(int i=0;iGetObjectArrayElement(stringArrays,i);
const char*mayarray=env->GetStringUTFChars(字符串,0);
…做一些工作或复制到C++的char数组…
env->ReleaseStringUTFChars(字符串,myarray);
env->DeleteLocalRef(字符串);
}

<代码> > p>这是我用来将java字符串数组<代码>字符串[]/COD>转换成C++ >代码>向量<代码>:< /p>的代码 最后,作为旁注,要将Java字符串列表转换为字符串数组(将其传递给JNI函数),可以执行以下操作:

void stringArrToStringVector(String[] jstringArr);
List<String> strList = new ArrayList<>();
// Populate strList
String[] strArr = new String[strList.size()];
strList.toArray(strArr);
List strList=new ArrayList();
//填充strList
String[]strArr=新字符串[strList.size()];
斯特利斯特-托雷(斯特拉尔);

回答得很好,但您应该在循环结束时调用
DeleteLocalRef(string)
,以避免创建数量无限的对象引用。另外,它应该是
ReleaseStringUTFChars(string,myarray)
@pburka:这两个都是正确的。虽然如果数组中的元素数量很小,这不会造成太大的差异,但我也不会造成伤害。对于ReleaseString调用来说,这是一个很好的捕获。通常我在使用jni时使用c,然后最后一个参数是iscopy。您希望字符串使用哪个字符集/编码(也称为“代码页”)?Unicode/UTF-16、Unicode/UTF-8、Windows-1252(但可能未修改UTF-8)。。。?Java字符串是Unicode,因此如果要转换为另一个字符集,如果目标字符集缺少一个字符,该怎么办?使用“?”或其他替代项,抛出异常。。。?
List<String> strList = new ArrayList<>();
// Populate strList
String[] strArr = new String[strList.size()];
strList.toArray(strArr);