ここでは本当に大きな問題があります。私はJavaからC++にbyte []を渡そうとしており、変換後に負の値を取得しています。私はJavaバイト[]に変換してログをとった後に値が0または負であるというユニークな文字を持つ問題を解決しました。JNI Java byte []をC++ bytearrayに変換して返す0
文字列のテストバイト[]を使用しようとしましたが正常に動作します。
ここに私のコードがあります。
のJava
public static native void SendMessage(byte[] message, int size); //size = message.length
C++
static void SendMessage(JNIEnv *env, jclass cls, jbyteArray array, jint array_length)
{
jbyte* content_array = (env)->GetByteArrayElements(array,NULL);
//*env->GetByteArrayRegion(array,0,array_length,content_array); //tried this as well, same results
LOGD("content:\n");
for (int i=0; i < array_length; i++)
{
LOGD("%d",content_array[i]);
}
//EDIT
SendMessage(client, (uint8_t*)content_array, array_length); //<- could the problem be at the point where I convert it to uint8_t?
(env)->ReleaseByteArrayElements(array,content_array,0);
}
今
content: 48
content: 23
content: 13
content: 56
content: 0 // <--- the problem starts here
content: -122
content: 0
content: 78
content: 32
content: -28
etc...
..
..
出力、簡単なテストバイト[] のJava
String test = "ABC";
byte[] message = test.getBytes();
public static native void SendMessage(byte[] message, int size); //size = message.length
0を使用してあなたの助けのための
C++
static void SendMessage(JNIEnv *env, jclass cls, jbyteArray array, jint array_length)
{
jbyte* content_array = (env)->GetByteArrayElements(array,NULL);
//*env->GetByteArrayRegion(array,0,array_length,content_array); //tried this as well, same results
LOGD("content:\n");
for (int i=0; i < array_length; i++)
{
LOGD("%d",content_array[i]);
}
(env)->ReleaseByteArrayElements(array,content_array,0);
}
出力
content: 65 //this works perfectly
content: 66
content: 67
感謝。とても有難い。
返信いただきありがとうございます。いいえ、私は文字列変換からバイト[]を取得していません。バイト[]は別のソースから渡されます。私はそれをJava側で文字列に変換してログを記録し、ユニークな文字が含まれていることがわかりました。 異なるエンコーディングについて述べました。プラットフォームのデフォルトから別のエンコーディングを設定する方法は? – user2117849
[String.getBytes(Charset)](http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#getBytes(java.nio.charset.Charset))を使用します。 –