当前位置: 首页 > news >正文

【Android】JNI报错 non-zero capacity for nullptr pointer分析

【Android】JNI报错 non-zero capacity for nullptr pointer分析

  • 背景
    某天,运行Android App时程序报错。
Abort message: 'JNI DETECTED ERROR IN APPLICATION: non-zero capacity for nullptr pointer: 1in call to NewDirectByteBufferfrom *****
  • 出错部分,调用了 NewDirectByteBuffer(原生JNI函数),创建了一块Buffer。pData是指针类型,dataSize是地址的大小。
byteBuffer = env->NewDirectByteBuffer(pData, dataSize);

NewDirectByteBuffer对应的实现,在art/runtime/jni/jni_internal.cc中。实现如下。

static jobject NewDirectByteBuffer(JNIEnv* env, void* address, jlong capacity) {
if (capacity < 0) {JavaVmExtFromEnv(env)->JniAbortF("NewDirectByteBuffer", "negative buffer capacity: %" PRId64,capacity);return nullptr;
}
if (address == nullptr && capacity != 0) {JavaVmExtFromEnv(env)->JniAbortF("NewDirectByteBuffer","non-zero capacity for nullptr pointer: %" PRId64, capacity);return nullptr;
}// At the moment, the capacity of DirectByteBuffer is limited to a signed int.
if (capacity > INT_MAX) {JavaVmExtFromEnv(env)->JniAbortF("NewDirectByteBuffer","buffer capacity greater than maximum jint: %" PRId64,capacity);return nullptr;
}
jlong address_arg = reinterpret_cast<jlong>(address);
jint capacity_arg = static_cast<jint>(capacity);jobject result = env->NewObject(WellKnownClasses::java_nio_DirectByteBuffer,WellKnownClasses::java_nio_DirectByteBuffer_init,address_arg, capacity_arg);
return static_cast<JNIEnvExt*>(env)->self_->IsExceptionPending() ? nullptr : result;
}

通过分析上面代码,可以看出来。当传入的地址,不为NULL,且申请的Size大于0的时候。会报错non-zero capacity for nullptr
因为,既然申请一段空间,那么就不应该用非空的地址去申请。

  • 综上

对应到出问题的地方。排查pData为NULL或者dataSzie不为0的情况,即可解决该问题。

byteBuffer = env->NewDirectByteBuffer(pData, dataSize);

http://www.mrgr.cn/news/54622.html

相关文章:

  • 第十八课:Python学习之多态
  • 关于懒汉饿汉模式下的线程安全问题
  • 解析带有MyBatis语法的SQL字符串,获取最终的可执行SQL
  • arc浏览器一些功能技巧
  • 如何使用八爪鱼爬取有价值的商业数据?
  • Java后端面试题:JVM篇
  • 跨国SAP实施 - 美国 - 税法 - 咨询
  • YoloV10改进策略:注意力改进|DeBiFormer,可变形双级路由注意力|引入DeBiLevelRoutingAttention注意力模块(全网首发)
  • C++:反向迭代器
  • ThreadLocal为什么会内存泄漏?如何解决?
  • python 几个日常小工具(计划表,合并文件)
  • 轻松应对PDF编辑难题:四款免费pdf编辑器实测体验
  • 公共字段自动填充-MyBatis-Plus
  • K近邻算法(KNN)的概述与实现
  • 【TDA】持续同调的矢量化方法
  • docker清理未使用的 Docker 资源
  • 【Linux】从 fork() 到 exec():理解 Linux 进程程序替换的魔法
  • 基于排名的股票预测的关系时态图卷积网络(RT-GCN)
  • 探索AI工具:从实用到创新的无限可能
  • 省心英语 3.9.9| 资源最全面的英语学习App
  • 实测:四大录音转文字助手哪家强?
  • Java中的日期类
  • LeetCode刷题日记之贪心算法(四)
  • 一款现代化、可定制的跨平台文件浏览器,高颜值高效率的的管理神器!(附私活源码)
  • 谷粒商城のRabbitMQ高级篇最终一致性解决方案。
  • Sourceforge下载镜像选择方法