Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Converting JNI Java byte[] to C++ bytearray, returning 0

I've a really big problem here. I am trying to pass a byte[] from Java to C++ and I am getting negative values after the conversion. I have determined the problem from having unique characters in the Java byte[] which after converting and doing a log, the values are either 0 or negative.

I have tried using a test byte[] of String characters and it works fine.

Here is my code, if it helps.

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); 
  }

Output

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

Now, using a simple test 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); 
  }

Output

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

Thanks for your help. Much appreciated.

like image 785
user2117849 Avatar asked Nov 03 '22 03:11

user2117849


1 Answers

How are you obtaining the byte[] array in the problem case? Is that also a conversion from a String? If so, getting zeros and negative values in your log output may be perfectly valid. It depends on the input characters and the encoding you are using to convert to a byte array. If you are using String.getBytes() as with your simple text, you will be using the platform default encoding. Your simple case shows that the default encoding is something ASCII-compatible.

like image 183
Jason Sankey Avatar answered Nov 08 '22 04:11

Jason Sankey