2015-04-05 49 views
0

沒有找到類似的問題,所以打開一個新的。函數返回後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有什麼關係。

回答

2

幾件事:
當你通過job->job_id,你傳遞的是該指針的VALUE,而不是指針本身。這意味着當您執行jobStr = (char*) malloc(len);時,您不會更改job->job_id,而只是該函數的局部變量。

所以,你需要傳遞的是什麼&(job->job_id),參數應該是char **jobstr

你那麼malloc會(不要忘記允許空終結符):

*jobStr = (char*) malloc(len +1); 

和,當然,下面的陳述應該參考*jobstr

+0

明白了。我的基本認識是錯誤的。 :) – 2015-04-11 14:28:05