0

C から Java に文字列を渡そうとしていますが、次のトレースで再起動します。これを修正する方法を理解してもらえますか?

PC: 2cf57c7c (__GI_strlen+0xc glibc-2.4/string/strlen.c:42) RA: 2cf202a0 (vfprintf+0x42c0 glibc-2.4/stdio-common/vfprintf.c:1549)

私の JNI コードは次のようになります。

JNIEXPORT jstring JNICALL xxx_nativeGetParentName
  (JNIEnv *env, jobject obj, jstring childName)
{
    log("nativeGetParentName entered\n");
    char *name; 
    Node* parentName = NULL;
    jstring jstr = NULL;

    name = (char *)(*env)->GetStringUTFChars(env, childName, NULL);
    if (name == NULL)
        return NULL;
    log("about to call mpe_hnGetParentName\n");
    int retCode = mpe_GetParentName(name,&parentName);  // Call to the C function which holds the implementation 
    (*env)->ReleaseStringUTFChars(env,childName,name);

    if (retCode != 0 ) {
       log("mpe_GetParentName called with return code=%d\n", retCode);
       return NULL;
    }

    if(parentName[0] != NULL) {
        jstr= (*env)->NewStringUTF(env, parentName[0]); // Hitting the reboot exactly here!
        log("getting ParentName Succeded=%s\n", jstr);
        free(parentUuid);
    }

    return jstr;
}

C 関数呼び出しのプロトタイプは次のようになります。

i32 GetParentName(Node childName, Node **parentName);

ノードは基本的に文字配列です。

typedef char[] Node;

CメソッドからparentNameを正常に取得していますが、JStringにマップしようとすると再起動します。

前もって感謝します!

4

1 に答える 1

1

2 番目のログ メッセージが問題である可能性が最も高いです。

log("getting ParentName Succeded=%s\n", jstr);

jstrjstring構造体へのポインタである型です。%sフォーマット式の有効な引数として渡すことができる文字列ではありません。

于 2012-07-08T07:24:29.560 に答える