java jni 数据类型转换_NDK开发 - JNI数据类型与Java数据类型映射关系

介绍完Android JNI的开发流程就要开始码代码了,不过在码代码前还是有必要了解下JNI数据类型与Java数据类型映射关系,直接开始写肯定会懵逼。

在调用 Java native 方法将实参传递给 C/C++ 函数的时候,会自动将 java 形参的数据类型自动转换成 C/C++ 相应的数据类型,所以我们在写 JNI 程序的时候,必须要明白它们之间数据类型的对应关系。

在 Java 语言中数据类型分为基本数据类型和引用类型,同样JNI中也对应着基础数据类型和引用类型。

基本数据类型

Java 中基本数据类型包括:byte, char, short, int, long, float, double, boolean。对应JNI数据类型的:jbyte, jchar, jshort, jint, jfloat, jdoubule, jboolean。

下面是JNI规范文档中描述 Java 与 JNI数据类型的对应关系:

java language type

native

description

boolean

jboolean

unsigned 8 bits

byte

jbyte

signed 8 bits

char

jchar

unsigned 16 bits

short

jshort

signed 16 bits

int

jint

signed 32 bits

long

jlong

signed 64 bits

float

jfloat

32 bits

double

jdouble

64 bits

引用类型

Java语言中除了上述的8中基本数据类型外其他都是引用类型:Object,String, 数组等。

所有的JNI引用类型全部是jobject类型,为了使用方便和类型安全,JNI 定义了一个引用类型集合,集合当中的所有类型都是 jobject 的子类,这些子类和 Java 中常用的引用类型相对应。例如:jstring 表示字符串、jclass 表示 class 字节码对象、jthrowable 表示异常、jarray 表示数组,另外 jarray 派生了 8 个子类,分别对应Java 中的 8 种基本数据类型(jintArray、jshortArray、jlongArray等)。

引用类型对应关系:

1460000006777988?w=1316&h=750

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java JNI 接口允许您在 Java 代码和本地代码之间传递对象。在 JNI Java 对象被表示为 jobject 类型,本地代码需要使用 JNIEnv 指针来访问 Java 对象。要转换对象类型,您可以使用以下 JNI 函数: 1. **IsInstanceOf**:检查对象是否是指定类的实例。该函数的原型如下: ```c jboolean IsInstanceOf(JNIEnv *env, jobject obj, jclass clazz); ``` 其,env 是指向 JNIEnv 的指针,obj 是要检查的对象,clazz 是要检查的类。 示例代码: ```c jclass integerClass = (*env)->FindClass(env, "java/lang/Integer"); jboolean isInteger = (*env)->IsInstanceOf(env, obj, integerClass); ``` 2. **NewObject**:创建一个新的 Java 对象。该函数的原型如下: ```c jobject NewObject(JNIEnv *env, jclass clazz, jmethodID methodID, ...); ``` 其,env 是指向 JNIEnv 的指针,clazz 是要创建对象的类,methodID 是要调用的构造函数的方法 ID,后面的参数是传递给构造函数的参数列表。 示例代码: ```c jclass integerClass = (*env)->FindClass(env, "java/lang/Integer"); jmethodID constructor = (*env)->GetMethodID(env, integerClass, "<init>", "(I)V"); jobject newInteger = (*env)->NewObject(env, integerClass, constructor, 42); ``` 3. **CallObjectMethod**:调用 Java 对象的实例方法。该函数的原型如下: ```c jobject CallObjectMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...); ``` 其,env 是指向 JNIEnv 的指针,obj 是要调用方法的对象,methodID 是要调用的方法的方法 ID,后面的参数是传递给方法的参数列表。 示例代码: ```c jclass stringClass = (*env)->FindClass(env, "java/lang/String"); jmethodID toLowerCase = (*env)->GetMethodID(env, stringClass, "toLowerCase", "()Ljava/lang/String;"); jobject lowerCaseString = (*env)->CallObjectMethod(env, obj, toLowerCase); ``` 以上是一些常用的 JNI 函数,可以帮助您在 Java 和本地代码之间传递对象,并转换对象类型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值