我想从我的 jni 方法返回无符号字符 []。我在 Jni 函数中有以下代码:
unsigned char abc[16]
abc[i] = 'b';
我使用 jstring 和 jcharArray 将 abc 返回到 java 代码。但是在使用 jstring 时,我无法正确编译程序。anb 在使用 chararray 时我得到了一些奇怪的字符。请提出一些解决方案如何处理这个问题。
我想从我的 jni 方法返回无符号字符 []。我在 Jni 函数中有以下代码:
unsigned char abc[16]
abc[i] = 'b';
我使用 jstring 和 jcharArray 将 abc 返回到 java 代码。但是在使用 jstring 时,我无法正确编译程序。anb 在使用 chararray 时我得到了一些奇怪的字符。请提出一些解决方案如何处理这个问题。
unsigned char
实际上,对应于 C 的 Java 数据类型是byte
. 您需要将您的方法声明为byte[]
在 Java 端返回,并在 C 端采取相应的行动。
这是否是正确的做法是另一个问题。在 C 中,“文本字符串”和“字节数组”几乎是同义词(模空终止);在Java中,不是这样。这是一串可读 (ASCII) 文本吗?如果是,则更自然地将其返回为jstring
; 要将 C 转换[unsigned] char *
为 a jstring
,请使用JNIEnv::NewStringUTF()
. 但是还有另一个警告:如果您的字符串位于 UTF-8 以外的代码页中并且包含非 ASCII 字符(代码 >= 0x80),则此方法不起作用;那么你最好将字符串作为字节数组传递出去,并通过 Java 端的正确代码页进行转换。
在我用 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
其中包含我使用的所有数据。