我在这里遇到了一个非常大的问题。我试图将一个byte []从Java传递给C ++,转换后我得到负值。我已经确定了Java字节[]中包含唯一字符的问题,在转换和执行日志之后,值为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...
..
..
现在,使用一个简单的测试字节[] 爪哇
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
感谢您的帮助。非常感谢。
答案 0 :(得分:1)
如何在问题案例中获得byte[]
数组?这也是String
的转换吗?如果是这样,在日志输出中获取零和负值可能是完全有效的。它取决于输入字符和用于转换为字节数组的编码。如果您使用String.getBytes()
作为简单文本,则将使用平台默认编码。您的简单案例表明默认编码与ASCII兼容。
答案 1 :(得分:1)
我不确定你认为这里的问题是什么。在Java中,byte
是签名类型,因此负值不是意外的。 Jbyte可能是一个匹配的8位带符号C ++类型。
最可能的解释是:
这是您创建字节数组的方式的一些假象;例如你已经用UTF-8编码了(虽然零会指示其他情况......)
您的size
参数值不正确:
由于某种原因,它大于字节数组大小。
将内容写入字节数组的过程没有将size
个字节放入其中。
值得注意的是,您的JNI代码不会检查0 <= size < message.length
。如果使用超出范围的size
参数调用此方法,则可能发生错误...包括分段错误,这将导致JVM崩溃。