2011-01-17 6 views
1

にC++から「unsigned char型の*」を渡すために、私は「unsigned char型*」を持っていると私は私がJNI:どのようにJavaの

次のようにそれを試してみましたJNI を使用してJavaコードにそれを渡したいです
jstring test1; 
std::string str(reinterpret_cast<const char*>(ucptest)); 
test1 = env->NewStringUTF(str.c_str()); 

ここで、 'ucptest'は 'unsigned char *'で、ascii値を持っています。 このコードは動作し、jstringをJavaコードに正常に渡すことができますが、ロード呼び出しではJVMでクラッシュが発生しています。

クラッシュの原因は何でしょうか?クラッシュは矛盾し、メモリ破損を意味する可能性があります。

誰かが「unsigned char *」をJavaに渡すより良い方法を提案できますか?

ご了承ください。

おかげ

+1

:として

コードを額装することができます、だからそう言いなさい。ポインタをJavaに渡すことは、整数にキャストするのと同じくらい簡単ですが、Javaコードがポインタを使って何もできないため、ポインタは無用になります。 –

+0

いいえ、私はJavaに渡す必要がある 'unsigned char *'という従来のコードを持っています – Vikas

+0

@ user578742はucptest Nullで終了していますか? – josefx

答えて

2

私は解決策を見つけましたが、私は同じものを共有すると思って、他の人がそれを使用できるようにしました。

最初はchar*をC++ Stringに変換してから、Java Stringに渡していました。私が変換しようとしていた文字列に "0"が来るまで、これはうまくいきました。これはクラッシュを引き起こしていました。

最後に、値をサーバーに渡すためにバイト配列を使用しました。これは完全に機能しています。あなたのケースでは

jbyteArray jbArray = env->NewByteArray((int)call.len); 
env->SetByteArrayRegion(jbArray, 0, (int)call.len, (jbyte*)call.data); 
+0

こんにちは、JavaでjbyteArrayを受け取り、Javaの文字列に変換する方法。 –

0

あなたは余分な鋳造工程で加えるなぜ私は表示されませんが、Javaの文字列はUnicodeが、unsigned char *またはwchar_t *またはstd::wstring().c_str()が、より直接的に使用することができます。使用している

unsigned char * ucptest=L"somestring"; 
jstring test1; 
std::string str(reinterpret_cast<const char*>(ucptest)); 
test1 = env->NewStringUTF(str.c_str()); 

jstring test2 = env->NewString(ucptest,wcslen(ucptest)); 
+0

私は "env-> NewString"を試みましたが、次のコンパイル時エラーが発生しました。 C2664: 'JNIEnv _ :: NewString':パラメータ1を 'unsigned char *'から 'const jchar *'に変換できません。指すタイプは無関係です。変換にはreinterpret_cast、Cスタイルのキャストまたはファンクションスタイルのキャストが必要です – Vikas

0

std::string constructorはヌルがC-終端文字列を期待します。コンストラクタはヌル文字を見つけるまで読み込みますが、クラッシュする可能性があります。文字列がヌル終端されていない場合は、別のコンストラクタを使用する必要があります(std::string(char*,size_t))。

+0

std :: string ctorを呼び出した後、文字列の末尾にNULLを割り当てます。 str [len] = null; ここで、lenは 'unsigned char *'の合計値のカウントを持つ変数です – Vikas

+0

@ user578742これは文字列ctorをどのように助けますか?ナルがなければ、ctorはどこで読書を止めるべきか分からない。 – josefx

+0

OK、試してみるstd::string(char*,size_t) 'unsigned char *'の値をJavaの コードに渡す方法はありますか?キャストしないで – Vikas

0

、ラインenv->NewStringUTF(str.c_str());getStaticMethodInfoをチェックするために、条件付きブロックの内部でなければなりません:あなたは、文字列ではなく、ポインタを渡すしようとしている

JniMethodInfo t; 

if (JniHelper::getStaticMethodInfo(t,<ANDROID CLASS PATH>,<METHOD NAME>,<PARAM TYPE>)) { 

    jstring jstr = t.env->NewStringUTF(<CONST CHAR* TYPE DATA>); 
    ...........CALL TO JAVA METHOD THROUGH JNI 
    t.env->DeleteLocalRef(t.classID); 

} 
関連する問題