java int与c jint天然对应,均为32位有符号整型,内存布局和取值范围完全一致,可零拷贝直通;声明native方法用int,c端实现必须用jint,禁止混用或强制转换以保障跨平台健壮性。

Java基本数据类型传给C语言底层4字节整型,核心在于类型映射和JNI规范的直接兼容性。int 类型在Java和C中都默认是32位有符号整数,无需手动转换,可直接使用。
Java int 与 C jint 的天然对应关系
Java 的 int 占4字节(-2³¹ 到 2³¹−1),C 中 JNI 定义的 jint 在绝大多数平台(包括 Android 和主流 Linux/Windows)也是 32 位有符号整型(通常等价于 int32_t 或原生 int)。二者内存布局、取值范围完全一致,属于“零拷贝”直通类型。
Java端声明与调用方式
- 声明 native 方法时直接使用
int:public native int multiply(int a, int b);
- 调用时传入普通 Java int 值即可:
int result = multiply(5, 8); // 自动映射为 jint
C端实现要点
- 函数签名中参数类型必须为
jint(不是int,尽管它们等价,但这是JNI规范要求):JNIEXPORT jint JNICALL Java_YourPackage_YourClass_multiply (JNIEnv *env, jobject obj, jint a, jint b) { return a * b; // 直接运算,无需转换 }
注意事项
- 不要自行强制类型转换(如
(int)a),虽然多数情况下可行,但破坏JNI类型安全约定,可能在某些严格ABI平台(如部分ARM64或旧NDK版本)引发未定义行为。 - 避免混用
int和jint作为函数参数或返回类型——即使编译通过,也会降低代码可读性和跨平台健壮性。 - 若需与纯C函数交互(非JNI回调),可安全将
jint传给接受int的函数,反之亦然,前提是确认目标平台int确实为32位(Android NDK 默认满足)。
基本上就这些。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











