沒有找到類似的問題,所以打開一個新的。函數返回後char *值的變化
我想在我的程序中將Java對象傳遞給JNI層,並在其中提取Java String字段。提取的字段在C結構中設置。
我看到一個奇怪的行爲。我能夠成功地提取所需的字段並將其memcpy在struct字段中。但是當我的效用函數返回時,struct中設置的字段會被破壞。 我懷疑內存泄漏和複查,但沒有發現可疑(我沒有做太多的動態內存的東西code..just一個malloc和free)。
這裏去代碼:
頭文件:
typedef struct Job {
char* job_id;
} Job;
C語言文件:
JNIEXPORT jint JNICALL Java_com.test.JobHandler__1submitJob(
JNIEnv *env, jobject this, jobject job) {
current_job = (Job *) malloc(sizeof(Job));
convert_job(env, job, current_job);
free(current_job);
}
void convert_job(JNIEnv *env, jobject javajob, Job *job) {
jclass cls = (*env)->GetObjectClass(env, javajob);
getVoidStringField(env, cls, javajob, job->job_id, "getJob_id");
//job->job_id gets corrupted here
}
void getVoidStringField(JNIEnv *env, jclass cls, jobject obj, char *jobStr, char *methodName) {
jmethodID mid = (*env)->GetMethodID(env, cls, methodName, "()Ljava/lang/String;");
jobject js = (*env)->CallObjectMethod(env, obj, mid);
const char *str = (*env)->GetStringUTFChars(env, js, 0);
int len = (*env)->GetStringUTFLength(env, js);
jobStr = (char*) malloc(len);
memcpy(jobStr, str, len);
jobStr[len] = '\0';
(*env)->ReleaseStringUTFChars(env, js, str);
//jobStr is fine till here.
}
我從我的代碼去除其他的東西,減少上面的版本簡單地調試,還是同樣的問題。
如果我通過修改getVoidStringField(...)有點接受工作對象,然後在求職> JOB_ID工作,它工作正常。
很想知道。我懷疑它與JNI有什麼關係。
明白了。我的基本認識是錯誤的。 :) – 2015-04-11 14:28:05