从jni返回无符号字符[]

时间:2013-03-12 13:45:50

标签: android android-ndk java-native-interface

我想从我的jni方法返回无符号字符[]。我在Jni函数中有以下代码:

unsigned char abc[16]
 abc[i] = 'b';

我使用jstring和jcharArray将abc返回给java代码。但是在使用jstring时我无法正确编译程序。 anb同时使用chararray我得到一些奇怪的字符。请提出一些解决方案来解决这个问题。

2 个答案:

答案 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,其中包含我处理过的所有数据。