NDK:在c+中保持从java层传递的变量的活动性+;按值逐层复制

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

嗨,我已经将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 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);