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