【问题标题】:Type Conversion from C to Java从 C 到 Java 的类型转换
【发布时间】:2012-07-17 14:11:09
【问题描述】:

我已尽力在 Google 上搜索,但无法以显示类型转换的表格形式找到明确的答案。

我想转换这些类型的原因是因为我正在使用 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 VM 是一个只有 32 位的 VM,所以转换应该是微不足道的。另见stackoverflow.com/a/11527544/841108
  • 按照this Java Tutorial page,指定宽度的有符号类型应该映射到byteshortint。至于其他人,找出答案的方法是打印出 sizeof(long) 等人的内容。告诉您何时在目标设备上运行。 (C 数据类型的宽度在某种程度上是特定于编译器和体系结构的。)
  • 但是<stdint.h> 给出了 C99 已知宽度的整数类型。
  • 您应该在界面中正确使用 j- 类型(jint 等) - 级 jni 代码。适应 java 的需求取决于 C,而不是相反。
  • @BasileStarynkevitch 无论如何都应该在所有 C 代码中使用它以实现可移植性。

标签: java android c type-conversion android-ndk


【解决方案1】:

这些是等价的,记住 Java 中原始数据类型的大小总是相同的,而 C 中数据类型的大小在某种程度上是编译器和体系结构特定的,正如 @ 所指出的那样cmets中的毫驼鹿。

另外,请注意 char 数据类型是 defined 作为“机器的最小可寻址单元,可以包含基本字符集。它是整数类型。实际类型可以是有符号或无符号,具体取决于实现",而在 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教程中相关部分的link,更详细的解释在Java Language Specificationsection §4.2中。

【讨论】:

  • @ÓscarLópez Int8 不会映射到 byte 吗?
  • @JuiCe 啊。无符号类型是非负的(它们没有符号位)。不过,我不确定为什么 Java 不支持它们。
  • @EricFinn Gosling 讨厌他们的原因是:gotw.ca/publications/c_family_interview.htm
  • char 不映射到 char。 Java char 是 2 个字节(UNICODE),而 C char 是 1 个字节(仅限 ASCII)。
  • 鉴于这是标记为 android,你真的需要摆脱 char-char 映射,因为在这个 char 是 8 位类型的平台上它是完全不正确的。
【解决方案2】:

你需要导入类

类 UInt32

java.lang.Object

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    相关资源
    最近更新 更多