NDK:在c+中保持从java层传递的变量的活动性+;按值逐层复制
嗨,我已经将jobjectArray(字符串数组)从Java层传递到JNI层。 我想让它在jni调用之间保持活动状态,所以我按值复制了它。但一旦我在jni调用之间切换,数据就会被破坏NDK:在c+中保持从java层传递的变量的活动性+;按值逐层复制,java,android,c++,android-ndk,java-native-interface,Java,Android,C++,Android Ndk,Java Native Interface,嗨,我已经将jobjectArray(字符串数组)从Java层传递到JNI层。 我想让它在jni调用之间保持活动状态,所以我按值复制了它。但一旦我在jni调用之间切换,数据就会被破坏 JNIEXPORT void JNICALL Java_com_package_class(JNIEnv *env, jobject jobj, ptr, jobjectArray ddls){ int ddlCount = env->GetArrayLength(ddls); const c
JNIEXPORT void JNICALL Java_com_package_class(JNIEnv *env, jobject jobj, ptr, jobjectArray ddls){
int ddlCount = env->GetArrayLength(ddls);
const char **ddls1 = (const char**)malloc(ddlCount);
for (int i=0; i<ddlCount; i++) {
jstring str = (jstring) env->GetObjectArrayElement(ddls, i);
const char *rawStr = env->GetStringUTFChars(str, NULL);
ddls1[i] = copyByValue(rawStr);
env->ReleaseStringUTFChars(str,rawStr);
}
for(int i=0; i<ddlCount; i++){
LOG("ddls1=%s", ddls1[i]);
}
//pass ddls1 to some class object
}
const char* copyByValue(const char* str) {
int size = strlen(str);
char* str1 = (char *) malloc((size+1)*sizeof(char));
memcpy(str1, str, size);
str1[size] = '\0';
return str1;
}
JNIEXPORT void JNICALL Java_com_package_类(JNIEnv*env、jobject jobj、ptr、jobjectArray ddls){
int ddlCount=env->GetArrayLength(ddls);
常量字符**ddls1=(常量字符**)malloc(ddlCount);
for(int i=0;IGETOBJECTARRAYLENT(ddls,i);
const char*rawStr=env->GetStringUTFChars(str,NULL);
ddls1[i]=copyByValue(rawStr);
环境->释放STRINGUTFCHARS(str,rawStr);
}
对于(int i=0;i这似乎是一个极其复杂的解决实际问题的方法,不管它可能是什么。为什么你使用<代码> MeMpPy <代码>而不是<代码> StrucP?实际上,因为这是C++而不是C,最安全最干净的方法是使用<代码> STD::vector < /C> >:
请让我知道我在这里做错了什么,最好的解决方法是什么
复制jni变量,以便在我们释放后它们不会损坏
JNI上下文
您已经使用指针而忽略标准C++类。
< >我将把<代码>拷贝<代码>对象存储在<强>静态C++变量>中,当然,如果JNI函数被不同线程使用,则可能会遇到并发问题,因此,如果使用多线程,请注意这一点。
完全不同的解决方案是只在java GETMeodod> /Cube >或<代码> GeFieldd .< /P>尝试找出什么是被破坏或丢失的:DDLS1(无论您经过何处,发布的副本都是短暂的)。,它指向的指针数组,或存储实际字符的指针的目标内存。谢谢,此解决方案已经运行良好。我已经有了此解决方案,但只是想知道使用const char**有什么问题。如果可能,请告知原始解决方案中的任何技术缺陷。
std::vector<std::string> copies;
// ...
char const *rawStr = env->GetStringUTFChars(str, NULL);
std::string const copy(rawStr);
env->ReleaseStringUTFChars(str, rawStr);
copies.push_back(copy);