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

devtools/2024/10/25 8:25:24/

capacity_for_nullptr_pointer_0">【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.ppmy.cn/devtools/128633.html

相关文章

《YOLO目标检测》—— YOLOv1 详细介绍

文章目录 一、算法特点二、网络结构三、检测过程四、损失函数五、性能表现六、优缺点 YOLO v1&#xff08;You Only Look Once version 1&#xff09;是一种快速的目标检测算法&#xff0c;以下是对YOLO v1的详细介绍&#xff1a; 一、算法特点 端到端的网络结构&#xff1a;Y…

axios退休了吗?现代Web开发的新请求策略

表单草稿功能的实用价值 在软件开发中&#xff0c;表单是用户与系统交互的重要界面。用户通过填写表单来提交数据&#xff0c;而系统则需要确保这些数据的准确性和完整性。然而&#xff0c;在实际使用中&#xff0c;用户可能会因为各种原因中断填写过程&#xff0c;比如网络问…

内网穿透工具——Cpolar

什么是内网穿透 内网穿透是一种网络技术&#xff0c;它允许从公共网络&#xff08;例如互联网&#xff09;访问位于私有网络&#xff08;内网&#xff09;中的设备或服务。在传统的网络环境中&#xff0c;私有网络通常由路由器、防火墙和网络地址转换&#xff08;NAT&#xff…

Ubuntu 通过Supervisor 或者 systemd 管理 .Net应用

在 Ubuntu 上安装 .NET 8.0&#xff0c;通过 supervisor 或 systemd 管理 .NET 应用服务&#xff0c;确保应用能够自动启动、运行以及在崩溃时重启。 1. 安装 .NET 8.0 最新的Ubuntu版本已经不需要注册 Microsoft 包存储库了&#xff0c;具体的可以参考微软官方文档安装&…

百度翻译以及另外三款翻译工具推荐!!!

在这个全球化的时代&#xff0c;翻译工具已经成为我们生活中不可或缺的一部分。我们需要使用翻译工具来克服语言障碍&#xff0c;无论是出国旅行、商务谈判还是学术研究。那么&#xff0c;市场上有各种各样的翻译工具。有哪些好用的在线翻译软件呢&#xff1f;别担心&#xff0…

MySQL 9从入门到性能优化-权限表

【图书推荐】《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;》-CSDN博客 《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;&#xff08;数据库技术丛书&#xff09;》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…

AMD平台,5600X+6650XT,虚拟机安装macOS 15 Sequoia 15.0.1 (2024.10)

macOS 15 Sequoia终于出正式版了&#xff0c;没有Mac&#xff0c;所以还是虚拟机玩玩&#xff0c;还是属于折腾&#xff0c;安装过程和之前差不多&#xff0c;这次我从外网获得了8核和16核openCore&#xff0c;分享一下。 提前发一下ISO镜像地址和openCore引导磁盘地址 ISO镜…

ElasticSearch 在不同集群之间进行数据迁移

ElasticSearch 在不同集群之间进行数据迁移 在两台集群分别安装s3插件&#xff0c;以允许数据上传至s3 elasticsearch-plugin install repository-s3在es配置文件jvm.options中添加如下内容&#xff1a; -Des.allow_insecure_settingstrue重启es 备份数据 此方法可以用于es…