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 String 数组的值复制到 C++ 数组中,以便 C++ 中的数组具有相同的值?提前致谢。

4

2 回答 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);
}
于 2013-10-25T14:05:57.483 回答
9

这是我用来将 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);
于 2017-08-31T20:22:06.193 回答