将String数组从Java传递给C ++

时间:2014-01-11 15:18:10

标签: java android c++ arrays java-native-interface

所以我有 Java中的字符串resultNative []和C ++中的char result [] [],如何使用JNI将数组从java传递到c ++? 我尝试了以下代码,但错误。谢谢。

JNIEXPORT void JNICALL Java_com_qualcomm_QCARSamples_ImageTargets_GetTargetData_returnResult(JNIEnv *env, jobject obj) {
int size = env->GetArrayLength(resultNative);

for (int i=0; i < size; ++i)
{
    jstring string = env->GetObjectArrayElement(resultNative, i);
    result[i] = env->GetStringUTFChars(string, i);
    env->ReleaseStringUTFChars(string, resultNative);
    env->DeleteLocalRef(string);
}

}

2 个答案:

答案 0 :(得分:1)

我认为你应该在发布之前复制GetStringUtf返回的内容。否则,您将存储指向已释放内存的指针,并可能稍后访问它。使用std:string是在c ++中执行它的正确方法,但是如果你真的坚持的话可以使用strdup。

如果result是一个std:string数组,这很简单     result [i] = std:string(env-&gt; GetStringUTFChars(string,i));

答案 1 :(得分:0)

您的代码缺少参数。此外,您甚至在使用它之前就会释放该字符串。将它分配给result[i]只会产生浅拷贝(指针的副本,而不是内容)。发布后,result[i]无效。

JNIEXPORT void JNICALL Java_com_qualcomm_QCARSamples_ImageTargets_GetTargetData_returnResult(JNIEnv *env, jobject obj, jobject stringArray)
{
    int length = env->GetArrayLength(stringArray);

    for (int i = 0; i < length; ++i)
    {
        jstring jstr = (jstring) env->GetObjectArrayElement(stringArray, i);
        const char* cpp_string = env->GetStringUTFChars(jstr, 0);

        std::cout<<cpp_string<<"\n";

        env->ReleaseStringUTFChars(jstr, cpp_string);
        env->DeleteLocalRef(jstr);
    }
}

如果要保存字符串,则为:

JNIEXPORT void JNICALL Java_com_qualcomm_QCARSamples_ImageTargets_GetTargetData_returnResult(JNIEnv *env, jobject obj, jobject stringArray)
{
    int length = env->GetArrayLength(stringArray);

    std::vector<std::string> array_of_str(length);

    for (int i = 0; i < length; ++i)
    {
        jstring jstr = (jstring) env->GetObjectArrayElement(stringArray, i);
        const char* cpp_string = env->GetStringUTFChars(jstr, 0);

        array_of_str.emplace_back(cpp_string);

        env->ReleaseStringUTFChars(jstr, cpp_string);
        env->DeleteLocalRef(jstr);
    }
}