[英]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.