我编写了一些使用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 ???
您能否告知我需要使用哪些数据类型?
由于 ģ
答案 0 :(得分:1)
请记住,Java中没有未签名的类型。因此,Java int
实际上无法存储C unsigned int
的所有值。您还假设C unsigned int
总是32位宽。它可以是一个不同的大小,虽然行业已经在某种程度上标准化了。
顺便说一下,按照你在这里的逻辑,int
到jint
到unsigned int
,byte
到jbyte
是unsigned char
至boolean
至jboolean
至_Bool
至1
(未充分利用的C99类型,只能保留0
或char
作为值。)
请注意,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。