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

Android 13中JNI IsSameObject方法返回值异常问题求助

问题原因与解决方案

核心原因

Android 13的ART虚拟机实现发生变更,当从JNI层获取Java层传入的null对象时,对应的jbyteArray本地引用不再直接等同于C语言的NULL。此时用IsSameObject对比该引用与NULL会返回false,而低版本Android的ART实现中两者等价,因此出现版本差异。

正确的判断方式

应使用JNI标准API IsNullObject检测对象是否为Java层的null,而非通过IsSameObject与NULL比较。修改后的代码如下:

jmethodID midGet = (*env)->GetMethodID(env, classArrayList, "get", "(I)Ljava/lang/Object;");
jbyteArray arr = (*env)->CallObjectMethod(env, arrayList, midGet, 0);
if (!(*env)->IsNullObject(env, arr)) {
    // 仅当arr不为Java null时执行
}

补充说明

JNI规范中,IsNullObject是专门用于判断JNI对象引用是否对应Java层null的标准方法,具备跨版本兼容性。而直接用IsSameObject(env, obj, NULL)的行为依赖于虚拟机的具体实现,不同ART版本可能存在差异,Android 13的实现调整正是导致该问题的直接原因。

内容的提问来源于stack exchange,提问作者Bao HQ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 06:53:15