如何将Java Long对象转换为C原生类型?JNI技术问询
如何将Java Long对象转换为C原生类型
好的,咱们来解决这个问题——把Java的Long对象转换成C原生类型其实很简单,核心是利用JNI提供的API完成Java包装类的拆箱操作。结合你给出的代码,我一步步说明:
首先要明确:Java里的Long是包装类,C端的64位整数对应JNI的jlong类型(这个类型在所有平台上都是64位,和Java的long基本类型一一对应)。要从Long对象拿到原生值,我们需要调用它的longValue()方法,这是Java包装类默认的拆箱方法。
修改后的完整JNI代码
extern "C" JNIEXPORT jobject JNICALL Java_passLong(JNIEnv *env, jobject instance, jobject myEntity) { jclass myEntityClazz = env->GetObjectClass(myEntity); jmethodID get_myEntityGUID = env->GetMethodID(myEntityClazz, "get_myEntityGUID", "()Ljava/lang/Long;"); jobject myEntityGUID = env->CallObjectMethod(myEntity, get_myEntityGUID); // 必须先处理Long对象为null的情况,避免JNI调用崩溃 if (myEntityGUID == nullptr) { // 这里可以根据业务需求调整,比如返回null或者抛出异常 return nullptr; } // 开始转换Java Long对象到C原生类型 // 1. 获取Java Long类的class对象 jclass longClazz = env->GetObjectClass(myEntityGUID); // 2. 获取longValue()方法的ID,方法签名"()J"表示无参数、返回long基本类型 jmethodID longValueMethod = env->GetMethodID(longClazz, "longValue", "()J"); // 3. 调用拆箱方法得到C端原生的jlong值 jlong nativeLongValue = env->CallLongMethod(myEntityGUID, longValueMethod); // 现在你可以用nativeLongValue做任何C端操作了,比如打印、计算 // 示例:打印这个原生值 printf("C端原生long值:%lld\n", nativeLongValue); // 可选:手动释放局部引用(JNI方法结束后会自动回收,但显式释放更稳妥) env->DeleteLocalRef(longClazz); // 如果你需要返回原Java Long对象,直接返回myEntityGUID即可 return myEntityGUID; }
关键步骤说明
- Null检查:Java的
Long允许为null,如果跳过检查直接调用longValue()会导致JNI崩溃,这一步一定要做。 - 方法签名解释:
()J是JNI的方法签名规则,()表示无参数,J对应Java的long基本类型。 - 原生类型使用:得到的
jlong就是C端可以直接使用的64位整数,你可以把它当作C++的long long或者C的int64_t来用(注意:不同平台上long的长度可能不同,用jlong或int64_t更安全)。
内容的提问来源于stack exchange,提问作者Program-Me-Rev
相关产品推荐
相关产品推荐

