NewIntArray返回NULL的场景排查:JNI调用SetIntArrayRegion报错问题
JNI中NewIntArray返回NULL的场景分析
我们的JNI代码实现如下:
jintArray result = env->NewIntArray(count); env->SetIntArrayRegion(result, 0, count, names);
但偶尔调用SetIntArrayRegion会触发错误:JNI DETECTED ERROR IN APPLICATION: java_array == null。我们已尝试NewIntArray(0)、传入超大数值、env = NULL这几种场景,均未复现该错误且报错信息不同。以下是NewIntArray可能返回NULL的其他场景:
JVM堆内存耗尽:当JVM的堆内存已被其他对象占用至临界值,即使
count数值并非特别大,也可能因无法分配新数组所需的内存空间,导致NewIntArray返回NULL。这种场景不是单纯传入超大数值就能复现,取决于当前JVM的实时内存状态。JNIEnv处于无效状态:并非
env直接为NULL,而是env对应的JNI环境失效:- 当前线程未通过
AttachCurrentThread附着到JVM就使用JNIEnv - 之前已调用
DetachCurrentThread,使该env不再有效 - 跨线程使用JNIEnv(JNIEnv是线程私有对象,跨线程引用会导致状态异常)
- 当前线程未通过
数组长度参数存在隐性非法值:虽然测试了0和超大数值,但如果
count是负数,或是因内存损坏产生的异常非法值,部分JVM实现会返回NULL而非直接抛出异常。JVM内部异常:JVM在执行数组分配时遇到内部状态错误,比如GC过程异常、类加载故障等,这种情况较为少见,但会导致数组分配失败返回NULL。
安全权限限制:若运行环境存在安全管理器,且当前JNI代码无数组分配权限,部分实现会返回NULL(通常这类场景会抛出SecurityException,但不排除部分JVM返回NULL的情况)
内容的提问来源于stack exchange,提问作者Anne Yu
相关产品推荐
相关产品推荐

