2015-04-05 47 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