2017-05-16 19 views
0

Androidスタジオ2.3.2 グレード実験0.9.2 最終NDK。 JavaでJNIを介して呼び出される小さな関数をCに書きましたが、そこには存在しない文字の前に文字列を返します。アンドロイドndk c関数リバース奇妙な値

static { 
    System.loadLibrary("myapp"); 
} 
public native String getMsg(String var); 

String stringreturnedfromC = getMsg("eee");//eee is not used 

このショーこの:

これは、Javaコールで

char * text() { 
     char * txt = "a"; 
     char * ret = malloc(strlen(a)+2); 
     strcat(ret,txt); 
     strcat(ret,"b"); 
     return ret; 
    } 

これは、Java

JNIEXPORT jstring JNICALL 
     Java_com_myapp_Main_getMsg(JNIEnv *env, jobject instance, jstring var) 
    { 
     char * msg = text(); 

     return (*env)->NewStringUTF(env, msg); 
    } 

に戻るには、JNI Cは次のとおりです。 これはCの関数であります_Main_getMsg ab

"ab"だけを返す必要があります。

これは異常な動作です。どうして?そして、どうすれば正しい文字列を手に入れることができますか?

+1

'のstrlen関数のようなものですか?そしてlenは何ですか? – greenapps

+0

最初のstrcat()をstrcpy()に置き換えます。 – greenapps

+0

#greenapps strlenは文字列の長さを返し、メモリを割り当てるために使用する必要があります。 strcat()を置き換えようとしています。 – Daniele

答えて

0

あなたの関数text()が正しくないことがわかりました。

は、(a)は `どのようなものです。この

char * text() { 
    char * txt = "a"; 
    char * ret = (char *)malloc(strlen(txt)); //malloc(strlen(a)+2); is incorrect statment 
    strcat(ret,txt); 
    strcat(ret,"b"); 
    return ret; 
} 
+0

この返品_Main9ab @greenappsの提案は正しいです。 – Daniele

+0

全くありません。あなたの 'malloc()'は、1バイトの不定値しか返しません。 * 2-char *文字列をそれに追加するために 'strcat()'を使用します(文字列 '' a "'は* 2文字* - "a"文字と終了文字 "\ 0"十分に悪いですが、 'ret'が指すメモリの内容は不定であるため、' 'a''の2つの文字の最終的な出力先は不明です。次に、別の 'strcat()'は最初の場所に収まらないものにさらに多くを追加しようとします。 –

+0

それはうまくいくでしょう - 同じように(char *)malloc(0)を割り当てます。 strcat(ret、 "何か長い") - [mac os/xcode]を入力します。誰かが窓でそれを実行しようとすることができますか? –

関連する問題