5

私はここで本当に大きな問題を抱えています。Java から C++ に byte[] を渡そうとしていますが、変換後に負の値を取得しています。Java byte[] に一意の文字が含まれていることから問題を特定しました。これは、変換してログを実行した後、値が 0 または負のいずれかになります。

String 文字のテスト byte[] を使用してみましたが、正常に動作します。

それが役立つ場合は、これが私のコードです。

ジャワ

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...
..
..

ここで、簡単なテスト byte[] Java を使用して

String test = "ABC";
byte[] message = test.getBytes();
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]); 
      } 
      (env)->ReleaseByteArrayElements(array,content_array,0); 
  }

出力

content: 65 //this works perfectly
content: 66
content: 67

ご協力いただきありがとうございます。とても有難い。

4

2 に答える 2

1

byte[]問題の場合、配列をどのように取得していますか? それもからの変換Stringですか?その場合、ログ出力でゼロと負の値を取得することは完全に有効である可能性があります。これは、入力文字と、バイト配列への変換に使用しているエンコードによって異なります。単純なテキストで as を使用している場合はString.getBytes()、プラットフォームの既定のエンコーディングを使用します。あなたの単純なケースは、デフォルトのエンコーディングがASCII互換のものであることを示しています。

于 2013-02-28T03:23:49.917 に答える
1

問題がここにあるとあなたが考えていることはわかりません。Java では、byteは符号付きの型であるため、負の値は想定外ではありません。Jbyte はおそらく、一致する 8 ビットの符号付き C++ 型です。

最も可能性の高い説明は次のとおりです。

  • これは、バイト配列を作成する方法のアーティファクトです。たとえば、UTF-8 でエンコードした場合 (ただし、ゼロはそうでないことを示す傾向があります ...)

  • パラメータの値がsize正しくありません:

    • 何らかの理由で、バイト配列のサイズよりも大きくなっています。

    • バイト配列に何かを書き込んだプロセスは、バイトを入れませんでしsizeた。


JNI コードがそれをチェックしないことに注意してください0 <= size < message.length。このメソッドがsize範囲外の引数で呼び出されると、悪いことが起こる可能性があります...セグメンテーション違反など、JVM のハード クラッシュにつながる可能性があります。

于 2013-02-28T03:23:59.977 に答える