简体   繁体   English

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

[英]Passing String array from Java to C++

so I have String resultNative[] in Java and char result[][] in C++, how can I pass array from java to c++ using JNI? 所以我在Java中有String resultNative []在C ++中有char result [] [],如何使用JNI将数组从Java传递到C ++? I have tried the following code but error. 我尝试了以下代码,但出错。 thank you. 谢谢。

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

} }

I think you should make a copy of what GetStringUtf returns before releasing it. 我认为您应该在释放它之前复制GetStringUtf返回的内容。 Otherwise you store a pointer to a freed memory and perhaps access it later on. 否则,您将存储一个指向已释放内存的指针,并可能在以后访问它。 Using std:string is the right way to do it in c++, but you could use strdup if you really insist. 使用std:string是在c ++中执行此操作的正确方法,但是如果您真的坚持的话,可以使用strdup。

If result is an array of std:string, this is as simple as result[i] = std:string(env->GetStringUTFChars(string, i)); 如果result是std:string的数组,则与result [i] = std:string(env-> GetStringUTFChars(string,i))一样简单;

Your code is missing a parameter. 您的代码缺少参数。 Also, you're releasing the string before you even use it. 另外,您甚至在使用字符串之前就将其释放。 Assigning it to result[i] just makes a shallow copy (copy of the pointer, not the contents). 将其分配给result[i]只会生成一个浅表副本(指针的副本,而不是内容的副本)。 After releasing it, result[i] becomes invalid. 释放后, 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);
    }
}

OR if you want to save the string then: 或者,如果您要保存字符串,则:

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

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

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