从Java到C++ JNI获取字符串数组

11

你好,我正在尝试使用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);

}

myarray是否包含传递的Java数组中相同的值?或者我该如何将通过JNI传递的Java字符串数组的值复制到C++数组中,以便C++数组包含相同的值?谢谢。


你想要使用哪种字符集/编码(也称为“代码页”)来处理字符串?Unicode/UTF-16、Unicode/UTF-8、Windows-1252(但可能不是修改过的UTF-8)等等?Java中的字符串是Unicode编码的,因此如果你想要转换成另一种字符集,那么如果目标字符集缺少某个字符,你想采取什么措施?使用“?”或其他替代字符,抛出异常等等? - Tom Blodget
2个回答

11

您传递的是对象数组,因此不能直接从该数组中获取字符。一种方法是这样的:

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);
}

1
回答不错,但你应该在循环结束时调用 DeleteLocalRef(string),以避免创建无限数量的对象引用。此外,应该是 ReleaseStringUTFChars(string, myarray) - pburka
@pburka:你说得对。虽然如果数组中的元素数量很少,这并没有太大的区别,但也不会有什么坏处。而且你很好地发现了ReleaseString调用的问题。通常我在使用jni时会使用c,然后最后一个参数是iscopy。 - mkaes

8
这是我用来将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字符串列表转换为字符串数组(这将传递给JNI函数),你可以执行以下操作:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接