NewDirectByteBuffer 是否在本机代码中创建副本

2023-11-24

我正在 C++ 中创建两个数组,这两个数组将在 java 端读取:

env->NewDirectByteBuffer
env->NewByteArray

这些函数会复制我发送的缓冲区吗? 我是否需要在 C++ 端的堆上创建缓冲区,或者是否可以在堆栈上创建它,因为 jvm 会复制它?

例如这段代码运行正常吗:

std::string stam = "12345";
const char *buff = stam.c_str();
jobject directBuff = env->NewDirectByteBuffer((void*)buff, (jlong) stam.length() );

另一个例子:

std::string md5 "12345";    
jbyteArray md5ByteArray = env->NewByteArray((jsize) (md5.length()));
env->SetByteArrayRegion(md5ByteArray, 0, (jsize) (md5.length()), (jbyte*)    
 md5.c_str());

字符串是在堆栈上创建的。这段代码是否始终有效,或者我是否需要在堆上创建这些字符串并负责在 java 使用完它后将其删除


您对 DirectByteBuffer 的使用几乎肯定会以惊人的、核心转储和不可预测的方式失败。它的行为可能因 JVM 实现和操作系统而异。问题是你的直接记忆must在 DirectByteBuffer 的生命周期内保持有效。由于您的字符串位于堆栈上,因此它很快就会超出范围。同时,Java 代码可能会也可能不会继续使用 DirectByteBuffer,具体取决于它是什么。你也在写Java代码吗?您能否保证在字符串超出范围之前完成对 DirectByteBuffer 的使用?

即使您可以保证这一点,也要意识到 Java 的 GC 是不确定的。人们很容易认为您的 DirectByteBuffer 不再被使用,但同时它在未回收的对象中徘徊,这些对象最终被 GC 清除,GC 可能会调用一些意外触及 DirectByteBuffer 的 Finalize() 方法,还有——卡布卢伊!在实践中,除了“共享内存”块之外,很难做出这些保证never在您的应用程序的整个生命周期中消失。

NewDirectByteBuffer 也不是那么快(至少在 Windows 中不是),尽管直觉上认为性能就是一切。我通过实验发现复制 1000 个字节比创建单个 DirectByteBuffer 更快。通常是much让 Java 将 byte[] 传递给 C++ 并让 C++ 将字节复制到其中(咳咳,假设它们适合)会更快。总的来说,我提出以下建议:

  1. 调用 NewByteArray() 和 SetByteArrayRegion(),返回结果 jBytearray 到 Java 没有后顾之忧。
  2. 如果性能是一个 要求,将 byte[] 从 Java 传递到 C++,并让 C++ 填充它 您可能需要两个 C++ 调用,一个用于获取大小,另一个用于获取大小 获取数据。
  3. 如果数据量很大,使用NewDirectByteBuffer和 确保 C++ 数据“永远”保留,或者直到您 非常确定 DirectByteBuffer 已被释放。

我还了解到 C++ 和 Java 都可以内存映射同一文件,并且这对于大数据非常有效。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NewDirectByteBuffer 是否在本机代码中创建副本 的相关文章

  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • 识别 Visual Studio 中的重载运算符 (c++)

    有没有办法使用 Visual Studio 快速直观地识别 C 中的重载运算符 在我看来 C 中的一大问题是不知道您正在使用的运算符是否已重载 Visual Studio 或某些第三方工具中是否有某些功能可以自动突出显示重载运算符或对重载运
  • 如何在 Qt 应用程序中通过终端命令运行分离的应用程序?

    我想使用命令 cd opencv opencv 3 0 0 alpha samples cpp cpp example facedetect lena jpg 在 Qt 应用程序中按钮的 clicked 方法上运行 OpenCV 示例代码
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • Tomcat 6找不到mysql驱动

    这里有一个类似的问题 但关于类路径 ClassNotFoundException com mysql jdbc Driver https stackoverflow com questions 1585811 classnotfoundex
  • 为什么这个二维指针表示法有效,而另一个则无效[重复]

    这个问题在这里已经有答案了 这里我编写了一段代码来打印 3x3 矩阵的对角线值之和 这里我必须将矩阵传递给函数 矩阵被传递给指针数组 代码可以工作 但问题是我必须编写参数的方式如下 int mat 3 以下导致程序崩溃 int mat 3
  • 在mysql连接字符串中添加应用程序名称/程序名称[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在寻找一种解决方案 在连接字符串中添加应用程序名称或程序名称 以便它在 MySQL Workbench 中的 客户端连接 下可见 SQL
  • 当单元格内的 JComboBox 中有 ItemEvent 时,如何获取 CellRow

    我有一个 JTable 其中有一列包含 JComboBox 我有一个附加到 JComboBox 的 ItemListener 它会根据任何更改进行操作 但是 ItemListener 没有获取更改的 ComboBox 所在行的方法 当组合框
  • 运行 Jar 文件时出现问题

    我已将 java 项目编译成 Jar 文件 但运行它时遇到问题 当我跑步时 java jar myJar jar 我收到以下错误 Could not find the main class myClass 类文件不在 jar 的根目录中 因
  • C++ int 前面加 0 会改变整个值

    我有一个非常奇怪的问题 如果我像这样声明一个 int int time 0110 然后将其显示到控制台返回的值为72 但是当我删除前面的 0 时int time 110 然后控制台显示110正如预期的那样 我想知道两件事 首先 为什么它在
  • Keycloak - 自定义 SPI 未出现在列表中

    我为我的 keycloak 服务器制作了一个自定义 SPI 现在我必须在管理控制台上配置它 我将 SPI 添加为模块 并手动安装 因此我将其放在 module package name main 中 并包含 module xml 我还将其放
  • Android JNI C 简单追加函数

    我想制作一个简单的函数 返回两个字符串的值 基本上 java public native String getAppendedString String name c jstring Java com example hellojni He
  • 高效列出目录中的所有子目录

    请参阅迄今为止所采取的建议的编辑 我正在尝试使用 WinAPI 和 C 列出给定目录中的所有目录 文件夹 现在我的算法又慢又低效 使用 FindFirstFileEx 打开我正在搜索的文件夹 然后我查看目录中的每个文件 使用 FindNex
  • C++ new * char 不为空

    我有一个问题 我在 ASIO 中开发服务器 数据包采用尖头字符 当我创建新字符时 例如char buffer new char 128 我必须手动将其清理为空 By for int i 0 i lt 128 i buffer i 0x00
  • String.Empty 与 "" [重复]

    这个问题在这里已经有答案了 可能的重复 String Empty 和 有什么区别 https stackoverflow com questions 151472 what is the difference between string
  • 可访问性不一致:参数类型的可访问性低于方法

    我试图在两个表单之间传递一个对象 基本上是对当前登录用户的引用 目前 我在登录表单中有一些类似的内容 private ACTInterface oActInterface public void button1 Click object s
  • 使用 omp_set_num_threads() 将线程数设置为 2,但 omp_get_num_threads() 返回 1

    我有以下使用 OpenMP 的 C C 代码 int nProcessors omp get max threads if argv 4 NULL printf argv 4 s n argv 4 nProcessors atoi argv
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File
  • 如何减少具有多个单元的 PdfPTable 的内存消耗

    我正在使用 ITextSharp 创建一个 PDF 它由单个 PdfTable 组成 不幸的是 对于特定的数据集 由于创建了大量 PdfPCell 我遇到了内存不足异常 我已经分析了内存使用情况 我有近百万个单元格的 1 2 在这种情况下有
  • Swagger/Openapi-Annotations:如何使用 $ref 生成 allOf?

    我正在生成 Rest 端点 包括添加OpenAPI Swagger对生成的代码进行注释 虽然它对于基本类型运行得很好 但我在自定义类方面遇到了一些问题 现在我有很多自定义类的重复架构条目 使用 Schema 实现 MyClass class

随机推荐

  • 强制 EPPLUS 以文本形式读取

    我正在开发一个应用程序来读取 xlsx 文件 进行一些验证并插入数据库 不幸的是 当我尝试读取标记为数字的列 带有 EAN 13 代码的 fe 时 我得到了 int 的最小值 用户看不到这一点 因为 Excel 可以正确显示它 如何让它以纯
  • Google Apps 脚本复制整个 Google Drive 文件结构;如何避免超时?

    我的组织正在切换到 Google Business 帐户 每个人都需要将其云端硬盘文件转移到新帐户 云端硬盘不允许在这些帐户之间转移所有权 因此我创建了一个脚本来将文件和文件夹从旧帐户复制到新帐户 旧帐户的内容已移至与新帐户共享的文件夹中
  • 自定义 Django 404 错误

    我有一个 404 html 页面 但在某些情况下我希望能够发送 json 错误消息 对于 404 和 500 等 我读了以下页面 https docs djangoproject com en dev topics http views t
  • Kubernetes RBAC 无法升级连接:禁止(user=system:anonymous、verb=create、resource=nodes、subresource=proxy)

    我正在运行启用了 RBAC 的 Kubernetes 1 6 2 我已经创建了一个用户kube admin具有以下集群角色绑定 kind ClusterRoleBinding apiVersion rbac authorization k8
  • 如何在Android中更改EditText的焦点颜色

    如何更改焦点颜色 橙色 EditText box 焦点颜色是整个控件周围的小边框 并且是明亮的 当控件获得焦点时为橙色 我怎样才能改变它的颜色 聚焦到不同的颜色 您必须创建 修改自己的 NinePatch 图像来替换默认图像 并将其用作 E
  • PHP 5.3 似乎默认缺少 Intl 扩展

    我的系统是 Ubuntu 12 04 PHP 5 3 我正在尝试运行一些基本的 Intl 代码 如下所示
  • React Native IOS 状态栏背景

    由于在 IOS 上不会应用将 backgroundColor 属性应用于 StatusBar 组件 我需要设置 SafeAreaView 的背景颜色以获得我想要的效果 它工作正常 但在 iPhone X 上它会在屏幕底部具有相同的颜色 我该
  • android发布apk比调试apk大

    我正在使用 proguard 来减少我的 apk 大小 调试 apk 从 90mb 减少到 55mb 但签名的 apk 为 71mb 这是我的 build gradle 代码 apply plugin com android applica
  • 无法调整react-chartjs-2圆环图的大小

    我正在尝试使用 React 和 gatsbyjs 制作一个圆环图 该图表工作正常 但我无法让它使用 div 的完整宽度 对于保留的区域来说 它显示的太小 render return
  • 扩展 Django Flatpages 以接受模板标签

    我在我们网站上的很多内容中使用了 django 平面页面 我想扩展它以接受内容中的 django 模板标签 我找到了这个snippet但经过一番嬉笑之后 我无法让它发挥作用 我是否正确地假设您需要对 django 平面应用程序进行 子类化
  • 我在命令提示符中看到一个问号,而不是货币符号

    我使用 Windows 7 Visual Studio 2013 C 和 NET 4 5 我的问题是下面一行的输出 Console WriteLine Car s value 0 C myNewCar determineMarketValu
  • 我怎样才能知道c中指针变量分配的内存大小[重复]

    这个问题在这里已经有答案了 我在这种情况下遇到了一些问题 您能请您提供一下想法吗 main char p NULL p char malloc 2000 sizeof char printf size of p d n sizeof p 在
  • => 在 Linq 表达式中意味着什么 [重复]

    这个问题在这里已经有答案了 虽然这是一个重复的问题 但我以前从未在代码中见过表达式 gt 如果我知道这是一个 lambda 表达式 我就会用 google 搜索并自己找出答案 谢谢 我是 Linq 的新手 所以当我在这段代码中遇到 gt 时
  • 如何制作 Django 查询集来选择组内具有最大值的记录

    这是我的 Django 类 class MyClass models Model my integer models IntegerField created ts models DateTimeField default datetime
  • 在 Python 中查找箭头键的值:为什么它们是三元组?

    我正在尝试查找本地系统分配给箭头键的值 特别是在 Python 中 我正在使用以下脚本来执行此操作 import sys tty termios class Getch def call self fd sys stdin fileno o
  • 如何防止 Excel 在宏计算时渲染电子表格?

    我的宏用数字更新一个大型电子表格 但它运行速度非常慢 因为 Excel 在计算时渲染结果 如何在宏完成之前阻止 Excel 渲染输出 我使用了两种建议的解决方案 Application ScreenUpdating False Applic
  • 如何在 thymeleaf 中处理和连接字符串

    我有一个字符串列表 这是我感兴趣的属性名称 我想连接这些字符串的值 但不使用属性名称 而是使用它们的属性值 我看到起点是 strings listJoin 但是我怎么能说将列表中的元素与属性文件中的值相匹配呢 该列表将是 name addr
  • 创建一个可根据其内容调整大小的 QDockWidget

    我有一个应用程序 需要在运行时根据用户输入以编程方式将固定大小的子窗口小部件添加到停靠窗口小部件 我想将这些小部件添加到 Qt RightDockArea 上的停靠栏 从上到下直到空间不足 然后创建一个新列并重复 本质上与流程布局示例相反
  • cpp中的“[=]”是什么意思

    请检查下面的代码 NodeScheduleLambda this 0 01f this gt removeFromParentAndCleanup true 那里面的 是什么意思呢 有谁可以帮帮我吗 谢谢 lambda 是一种未命名 匿名函
  • NewDirectByteBuffer 是否在本机代码中创建副本

    我正在 C 中创建两个数组 这两个数组将在 java 端读取 env gt NewDirectByteBuffer env gt NewByteArray 这些函数会复制我发送的缓冲区吗 我是否需要在 C 端的堆上创建缓冲区 或者是否可以在