【问题标题】:Which JNI data type?哪种 JNI 数据类型?
【发布时间】:2011-12-17 21:50:37
【问题描述】:

我已经编写了一些代码,它使用 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       ???

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

谢谢 G

【问题讨论】:

  • 在某些架构(尤其是 ARM)上,使用 32 位值比使用 16/8 位值更快。因此,除非它是我们正在谈论的存储空间,否则将参数传递为 int/jint 可能是一个净赢。

标签: android c types java-native-interface


【解决方案1】:

C 语言中的布尔值有一个答案on this site

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

【讨论】:

  • 无符号字符 *body = (*env)->GetShortArrayElements(env, myjshortArray, 0);我收到“警告:从不兼容的指针类型初始化”
【解决方案2】:

请记住,Java 中没有无符号类型。因此,Java int 实际上并不能存储 C unsigned int 的所有值。您还假设 C unsigned int 始终为 32 位宽。它可以是不同的大小,尽管行业已经对其进行了标准化。

除此之外,按照这里的逻辑,intjintunsigned intbytejbyteunsigned charboolean is to jboolean is to _Bool(一种未充分利用的 C99 类型,只能将 10 作为值。)

请注意,C 中的 char 与 Java 中的 char 不同;前者代表一个字节,不管它有多少位宽,而后者代表一个 UTF-16 字符。另请注意,char 在 C 中可能是有符号或无符号的,具体取决于编译器和平台,因此为了安全起见,如果符号可能很重要,您应该显式使用 signed char

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-10
    • 2013-08-23
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 2018-06-11
    相关资源
    最近更新 更多