从C到Java的类型转换

从C到Java的类型转换,java,android,c,type-conversion,android-ndk,Java,Android,C,Type Conversion,Android Ndk,我尽了最大的努力在谷歌上搜索这个问题,但在一个类似表格的表格中找不到一个清晰的答案,该表格显示了类型转换 我之所以要转换这些类型,是因为我使用Android NDK从本机代码调用函数。问题是本机代码调用了Java中不存在的不同类型 我实际上没有C语言的经验,通过快速查看代码,我发现了这几种类型。请随意编辑此文章,添加不同类型的转换 From C to Java long -> short -> char -> unsigned long -> unsigned

我尽了最大的努力在谷歌上搜索这个问题,但在一个类似表格的表格中找不到一个清晰的答案,该表格显示了类型转换

我之所以要转换这些类型,是因为我使用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类型,请解释原因。

这些是等价的,记住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教程中相关部分的一个示例,以及。

中关于导入类的更详细说明

UInt32级

java.lang.Object


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

Android-Dalvik虚拟机是一个仅32位的虚拟机,因此转换应该很简单。另请参见,具有指定宽度的有符号类型应根据映射到
byte
short
int
。至于其他的,一种方法是打印出在目标设备上运行时的
sizeof(long)
等信息。(C数据类型的宽度在某种程度上取决于编译器和体系结构。)但是
给出了C99的已知宽度的整数类型。正确地说,您应该在接口级jni代码中使用j类型(jint等)。要适应java的需要,这取决于C语言,而不是相反的方式。@BasileStarynkevitch,为了便于移植,它应该在所有C代码中使用。@scarLópez不会
Int8
映射到
byte
?@JuiCe啊。无符号类型是非负的(它们没有符号位)。不过,我不知道为什么Java不支持它们。@EricFinn Gosling讨厌它们,原因是:char不映射到char。Java字符是2个字节(UNICODE),而C字符是1个字节(仅ASCII)。考虑到这是标记为android的,您确实需要去掉字符映射,因为在这个8位字符类型的平台上,它完全不真实。