嗨我有jobjectArray(字符串數組)從Java層傳遞到JNI層。 我想在jni調用之間保持它的活躍狀態,所以我通過值複製它。但是一旦我在jni調用之間切換,數據就會被破壞。NDK:保持從java層傳遞的變量通過值複製
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;
}
現在,當我失去這個JNI上下文中,數據(ddls1)被損壞。有時在更改JNI上下文之前,即使在打印時,它也會崩潰。
請讓我知道我在做什麼錯在這裏以及什麼是複製jni變量的最佳方法,以便在我們鬆散JNI上下文後它們不會被破壞。
試圖弄清*什麼*被損壞或丟失:ddls1(無論你通過它,發佈的副本是短暫的),它指向的指針數組,或指向實際字符的指針的目標內存存儲。 –