You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:54:44