使用JNI从Java到本机(C ++)代码的byte []

时间:2013-07-14 10:58:33

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

我正在使用Java进行Android开发,其中一些本机部分(外部库)用C ++编写。

我想将一个byte []从托管(Java)应用程序传递到本机(C ++)库:

// Declaration for the native method in Java
private native void someMethod(byte[] data);

在本机方面,我想将字节数组用作另一个提供的本机函数的参数。

我已经阅读了有关将数组数据转换(复制)为兼容类型( GetByteArrayElements )的JNI方法,但是这给我留下了 jbyte * 类型,这与我正在使用的库不兼容(库定义了它自己的 nByte 类型,这是一个unsigned char。)

这种情况的最佳选择是什么?

我应该坚持使用JNI描述的方法,并将jbyte数组类型转换为适当的nByte数组吗?还有其他选择吗?

1 个答案:

答案 0 :(得分:1)

  

我应该坚持使用JNI描述的方法,并将jbyte数组类型转换为适当的nByte数组吗?

是的,由于jbytenByte是不同的类型,这似乎是唯一可靠的方式,而不会触发未定义的行为。在实践中,nByte的大小很可能与jbyte的大小相同,因此您可以将jbyte*的指针重新解释为nByte* },但这不是一个可移植的解决方案。

如果您的图书馆使用int8_t <cstdint>,那么故事会有所不同,那么您就可以将jbyte的指针重新解释为int8_t的指针消极后果。