android - 哪种 JNI 数据类型?

标签 android c types java-native-interface

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

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

谢谢 G

最佳答案

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

除此之外,按照这里的逻辑,intjintunsigned int as bytejbyteunsigned charbooleanjboolean_Bool(未充分使用的 C99 类型,只能将 10 作为值。)

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

关于android - 哪种 JNI 数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7940045/

相关文章:

java - Android 将一个 fragment 导航到另一个 fragment 可以正常工作,但是看不到其他 fragment 的背景

c++ - 只有在充满 for 循环时才打开缓冲区播放

arrays - Ada:为什么 ""A".. "F""不是离散的?

android - 如何解决 Xamarin Android 中的 SIGSEGV 崩溃问题

android - 分配给问题并完成问题的 Git-lab 推送

Android:找不到startActivityForResult request_code

c - Eclipse:由于依赖性冲突,无法安装 CDT

c - 将字符串传递给 C 中的函数

php - 在 Symfony2 中设置实体类型的默认值

ios - Gameplaykit GKState,带有两个参数的 swift func