将JNI Java byte []转换为C++ bytearray,返回0

use*_*849 5 java java-native-interface

我在这里遇到了一个非常大的问题.我试图将一个byte []从Java传递给C++,转换后我得到负值.我已经确定了在Java byte []中使用唯一字符的问题,在转换和执行日志之后,值为0或负数.

我已经尝试使用字符串字符的测试字节[],它工作正常.

这是我的代码,如果它有帮助.

Java的

public static native void SendMessage(byte[] message, int size); //size = message.length
Run Code Online (Sandbox Code Playgroud)

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); 
  }
Run Code Online (Sandbox Code Playgroud)

产量

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...
..
..
Run Code Online (Sandbox Code Playgroud)

现在,使用一个简单的测试byte [] Java

String test = "ABC";
byte[] message = test.getBytes();
public static native void SendMessage(byte[] message, int size); //size = message.length 
Run Code Online (Sandbox Code Playgroud)

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); 
  }
Run Code Online (Sandbox Code Playgroud)

产量

content: 65 //this works perfectly
content: 66
content: 67
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助.非常感激.

Jas*_*key 1

您如何获取byte[]问题案例中的数组?这也是从 a 转换而来吗String?如果是这样,在日志输出中获取零和负值可能是完全有效的。它取决于输入字符和用于转换为字节数组的编码。如果您将String.getBytes()as 与简单文本一起使用,则将使用平台默认编码。您的简单情况表明默认编码是与 ASCII 兼容的。