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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 04:01:44