从C语言到Java的类型转换

9

我尽力通过谷歌搜索,但无法找到一个干净的表格形式来展示类型转换。

我想要进行这些类型的转换,是因为我正在使用Android NDK从本地代码调用函数。问题在于本地代码调用了Java中不存在的不同类型。

实际上,我没有C语言经验,只是快速查看了一些代码并找到了这些少数类型。请随意编辑此帖以添加需要转换的不同类型。

From C to Java

long ->

short ->

char ->

unsigned long ->

unsigned short ->

unsigned char ->

byte ->

Int8 ->

Int16 ->

Int32 ->

UInt8 ->

UInt16 ->

UInt32 ->

此外,如果其中任何一个无法转换为Java类型,请解释原因。

Android Dalvik虚拟机是一个仅支持32位的虚拟机,因此转换应该很简单。另请参阅http://stackoverflow.com/a/11527544/841108。 - Basile Starynkevitch
指定宽度的有符号类型应该按照此Java教程页面映射到byteshortint。至于其他类型,一种找出方法是在目标设备上运行sizeof(long)等命令并打印输出结果。(C数据类型的宽度在某种程度上取决于编译器和架构。) - millimoose
但是 <stdint.h> 为 C99 提供了已知宽度的整数类型。 - Basile Starynkevitch
1
在您的接口级JNI代码中,应该正确使用j-类型(jint等)。而且C语言需要适应Java的需求,而不是反过来。 - Chris Stratton
@BasileStarynkevitch 这应该在所有 C 代码中使用,以确保可移植性。 - millimoose
显示剩余2条评论
2个回答

7
这些是对应关系,需要注意的是在Java中原始数据类型的大小始终相同,而在C中数据类型的大小在某种程度上取决于编译器和体系结构,正如@millimoose在评论中指出的那样。此外,请注意,char数据类型被定义为“机器上最小可寻址单元,可以包含基本字符集。它是一种整数类型。实际类型可以根据实现是有符号还是无符号。”而在Java中则是单个16位Unicode字符。
long -> long
short -> short
char -> char
unsigned long -> N/A
unsigned short -> N/A
unsigned char -> N/A
byte -> byte
Int8 -> byte
Int16 -> short
Int32 -> int
UInt8 -> N/A
UInt16 -> N/A
UInt32 -> N/A

在Java中没有无符号原始数据类型。 byte 类型使用8位,int 32位,short 16位和long 64位。
这里是Java教程相关部分的链接,以及Java语言规范第4.2节中更详细的解释。

3
Int8 不是被映射为 byte 吗? - millimoose
1
@JuiCe 啊。无符号类型是非负的(它们没有符号位)。虽然我不确定为什么Java不支持它们。 - Eric Finn
1
Java的chars是UCS-2代码点。(或者可能是UTF-16序列。)因此,它更等同于C的wchar。也许吧。我总是记不清楚在纯C中应该如何处理Unicode。 - millimoose
2
char不映射到char。Java的char是2个字节(UNICODE),而C的char是1个字节(仅限ASCII)。 - jn1kk
2
鉴于这被标记为Android,你真的需要摆脱char-char映射,因为在这个平台上,char是一个8位类型,完全不正确。 - Chris Stratton
显示剩余8条评论

-1

你需要导入类

UInt32类

java.lang.Object

然后你可以简单地使用Uint32和Uint16


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接