简体   繁体   English

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

[英]Get an Array of Strings from Java to C++ JNI

Good day, I am trying to copy a Java string array to C++ array using JNI. 美好的一天,我试图使用JNI将Java字符串数组复制到C ++数组。 I have tried this but does not seem to be working. 我试过这个,但似乎没有工作。

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

}

Does the myarray hold the same values in the Java array passed? myarray在传递的Java数组中是否保持相同的值? Or how can I copy the values of the java String array passed through JNI to a C++ array, so the array in C++ holds the same vale? 或者如何将通过JNI传递的java String数组的值复制到C ++数组中,因此C ++中的数组是否具有相同的值? Thanks in advance. 提前致谢。

You pass an array of objects so you cannot just get chars from this array. 您传递了一个对象数组,因此您不能只从此数组中获取字符。 A way would be like this: 一种方式是这样的:

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

This is the code that I use to convert a Java string array String[] to a C++ vector<string> : 这是我用来将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);
        }
}

And on the Java side the function will look like the following: 在Java方面,该函数将如下所示:

void stringArrToStringVector(String[] jstringArr);

And finally, as a side note, to convert from a Java string list to string array (which you will pass to your JNI function), you can do the following: 最后,作为旁注,要从Java字符串列表转换为字符串数组(您将传递给JNI函数),您可以执行以下操作:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM