函数返回后char *值的变化

时间:2015-04-05 04:34:02

标签: c java-native-interface

没有找到类似的问题,所以开了一个新问题。

我试图在我的程序中将Java对象传递给JNI层并在其中提取Java String字段。提取的字段在C结构中设置。

我看到了一种奇怪的行为。我能够成功提取所需的字段并将其存储在struct字段中。但是当我的实用程序函数返回时,struct中设置的字段会被破坏。 我怀疑内存泄漏并重新检查,但没有什么看起来可疑(我没有做很多动态内存代码..只需要一个malloc并且免费。)

以下是代码:

标题文件:

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对象然后处理 job-> job_id ,它就可以正常工作。

很想知道。我怀疑它与JNI有关。

1 个答案:

答案 0 :(得分:2)

一些事情:
传入job->job_id时,传入的是该指针的VALUE,而不是指针本身。这意味着当您执行jobStr = (char*) malloc(len);时,您不会更改job->job_id,而只会更改该函数的局部变量。

那么,您需要传递的内容是&(job->job_id),参数应为char **jobstr

那么你的malloc就是(不要忘记允许空终止符):

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

当然,以下陈述应参考*jobstr