【问题标题】:Passing String array from Java to C++将字符串数组从 Java 传递到 C++
【发布时间】:2014-01-11 15:18:09
【问题描述】:

所以我有 Java中的String 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);
}

}

【问题讨论】:

  • 如果你也发布你得到的实际错误可能会很有用。

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


【解决方案1】:

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

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

【讨论】:

  • 嗯。你有一个如何正确地做到这一点的例子吗?也许我这样做的方式是错误的..我是新手,对C++不太熟悉:(
【解决方案2】:

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

【讨论】:

猜你喜欢
  • 2015-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-08
  • 1970-01-01
  • 2012-10-06
  • 2021-08-13
相关资源
最近更新 更多