我想从我的jni方法返回无符号字符[]。我在Jni函数中有以下代码:
unsigned char abc[16]
abc[i] = 'b';
我使用jstring和jcharArray将abc返回给java代码。但是在使用jstring时我无法正确编译程序。 anb同时使用chararray我得到一些奇怪的字符。请提出一些解决方案来解决这个问题。
答案 0 :(得分:4)
与C unsigned char
对应的Java数据类型实际上是byte
。您需要将方法声明为在Java端返回byte[]
,并相应地在C端执行操作。
这是否是正确的做法是另一个问题。在C中,“一串文本”和“一个字节数组”几乎是同义词(模数空终止);在Java中,不是这样。这是一串可读(ASCII)文本吗?如果是, 更自然地将其作为jstring
返回;要从C [unsigned] char *
转换为jstring
,请使用JNIEnv::NewStringUTF()
。但是还有另一个警告:如果你的字符串在UTF-8以外的代码页中并且具有非ASCII字符(代码> = 0x80),那么这将不起作用;那么你最好把字符串作为字节数组传递出去,然后通过Java端的正确代码页进行转换。
答案 1 :(得分:0)
在用C ++完成所有工作之后,我将数据从常规的本机字节数组(实际上是unsigned char *dataB
)复制到新的JNI对象jbyteArray
(对于JNI),可以返回到Java代码:
...
//Prepare jbyteArray to return to Java
jbyteArray resultReturn = env->NewByteArray(dataLength);
//copy data:
env->SetByteArrayRegion(resultReturn, 0, dataLength, reinterpret_cast<const jbyte *>(dataB));
return resultReturn;
}
其中dataB是一个字节数组unsigned char *dataB
,其中包含我处理过的所有数据。