5

我这里有一个很大的问题。我正在尝试将 byte[] 从 Java 传递到 C++,并且在转换后得到负值。我已经通过在 Java byte[] 中具有唯一字符来确定问题,在转换并执行日志之后,值是 0 或负数。

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

这是我的代码,如果有帮助的话。

爪哇

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[]在问题案例中获得数组?这也是a的转换String吗?如果是这样,在日志输出中获取零和负值可能是完全有效的。这取决于您用于转换为字节数组的输入字符和编码。如果您使用String.getBytes()as 与您的简单文本,您将使用平台默认编码。您的简单案例表明默认编码与 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 回答