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
相关产品推荐
相关产品推荐

