将字符串数组从 Java 传递到C++

Passing String array from Java to C++

本文关键字:C++ Java 字符串 数组      更新时间:2023-10-16

所以我有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);
}

}

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

如果结果是一个 std:string 数组,这就像 result[i] = std:string(env->GetStringUTFChars(string, i));

您的代码缺少参数。此外,您甚至在使用字符串之前就将其释放。将其分配给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);
    }
}