哪种JNI数据类型?

时间:2011-10-29 16:15:42

标签: android c types java-native-interface

我编写了一些使用jni在java和c之间传递值的代码。

目前所有的数字都被定义为int(java) - > jnit(jni / c) - > unsigned int(c)

代码可以工作,但它真的很低效,因为并非所有传递的数字都需要一个整数可用的内存。

我的代码中有3种类型的值需要保存0到4294967295,0到255和0到1的数字范围。

我无法在所有3种语言中找到兼容的数据类型。

Range           Java          C/JNI          C
4294967296      int           jint           unsigned int
256             ???           ???            unsigned char
2               boolean       jboolean       ???

您能否告知我需要使用哪些数据类型?

由于 ģ

2 个答案:

答案 0 :(得分:1)

请记住,Java中没有未签名的类型。因此,Java int实际上无法存储C unsigned int的所有值。您还假设C unsigned int总是32位宽。它可以是一个不同的大小,虽然行业已经在某种程度上标准化了。

顺便说一下,按照你在这里的逻辑,intjintunsigned intbytejbyteunsigned charbooleanjboolean_Bool1(未充分利用的C99类型,只能保留0char作为值。)

请注意,C中的char与Java中的char不同;前者表示单个字节,但可能是多个位宽,而后者表示UTF-16字符。另请注意,signed char可能会在C中签名或取消签名,具体取决于编译器和平台,因此为了安全起见,如果符号可能很重要,则应明确使用{{1}}。

答案 1 :(得分:1)

对于C中的布尔值,有一个答案on this site

并且java中的字节将覆盖256的范围,但是它们是有符号的,所以使用short可能更简单。基本上java类型是签名的,最简单的处理方法是确保你的映射类型大于你想要包含的范围,如此短,范围为256,长为4.2x10 ^ 9,如int覆盖 - 2,147,483,648,最大值2,147,483,647。