jni 和在 java 中使用 c++ new'ed 对象

2024-04-10

我有一个与数据库对话的 C++ 层,这个 C++ 层执行一个新的 SomeObject() 并将其返回给 java。

我什么时候可以安全地通过 clean jni 调用删除 SomeObject。我可以在java返回对象后立即删除还是需要复制该对象然后删除?


正如 Daff 所写,你不能“将 C++ 对象返回到 Java”,但你可以做的是返回该对象的地址,如 long:

jlong obj_ptr = reinterpret_cast<jlong>( &obj );

您应该确保根标头中的某个位置 jlong​​ 的大小足以容纳指针(通常应该如此,因为 Java long 是 64 位宽)。我使用 Boost 的静态断言来检查这一点:

#include <boost/static_assert.hpp>
BOOST_STATIC_ASSERT(sizeof(jlong)>=sizeof(void *));

只要需要它(或其数据),C++ 对象就应该存在,无论是在 Java 还是 C++ 中 - 无论如何,它不能被 Java 直接删除。当您确定可以安全地删除它时,您可以从 java 进行另一个 JNI 调用,传递 long 值,使用 a 将其转换为适当的指针reinterpret_cast<SomeObject *>( the_jlong_value ),然后将其删除。当然,您必须手动删除它,JVM 完全不知道它的存在,并且手动内存管理的所有注意事项都适用......

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

jni 和在 java 中使用 c++ new'ed 对象 的相关文章

  • 调用静态 JNI 方法从 C++ 返回字符串

    我正在尝试在Android中调用以下java方法 public static String getLevelFile String levelName body 从 C 使用以下 jni 代码 JniMethodInfoJavaApi me
  • 在 Java 对象中存储本机指针的“正确”方法是什么?

    在 Java 对象中存储本机指针的 正确 方法是什么 我可以将指针视为 Javaint 如果我碰巧知道本机指针的大小 long如果我碰巧知道本机指针的大小 Edit 从 JNI 函数返回本机指针正是我所要做的don t想做 我宁愿返回一个代
  • 如何在Linux上为JNI应用程序编译动态库?

    我在用着乌班图10 10 这就是我所做的 你好 java class Hello public native void sayHello static System loadLibrary hellolib public static vo
  • 如何将 jstring 转换为 wchar_t *

    假设在 C 方面 我的函数采用类型变量jstring named myString 我可以将其转换为 ANSI 字符串 如下所示 const char ansiString env gt GetStringUTFChars myString
  • 如何从 C++ 调用 Java 方法

    我正在使用 JNI 从 Java 调用我的 C 函数 C 函数的参数之一是jobject thiz 据我所知 所有 JNI 原生函数都有这个参数 该功能需要很长时间才能完成 我想向jobject thizJava 对象 以便我可以向用户显示
  • 如何在普通的非Android Java应用程序中使用NDK编译的JNI库?

    我有一个 JNI 库 供 Android 应用程序与 NDK 一起使用 我没有源代码 只是为某些拱门编译了 so 文件 我想在 64 位 x86 Linux PC 上的简单控制台 Java 应用程序中调用该库中的函数 我做了什么 我从 x8
  • 调用 C 子例程时出现 JNI 错误

    我想从 Java 调用 C 子例程 我正在使用 JNI 我创建了 java c 和 h 文件 并编译了 DLL 所有文件都在同一个文件夹中 但是当我运行该程序时 它显示unsatisfiedlinkError 我哪里出错了 在学习JNI时
  • Java 中是否可以加载同一个 DLL 的不同版本?

    我有一个 JNI 库 它与一组第三方库交互 并且系统上可能有多个版本的第三方库 对于每个版本的第三方库 出于可比性的原因 我都必须重新编译 JNI 代码 现在 我通过加载具有特定名称的 DLL 来处理此问题 如果版本发生更改 我会更改 JN
  • 使用 JNI 链接静态库

    Java 8 之前的 Java 版本要求本机代码位于共享库中 但我读到 在 Java 8 中可以将静态链接库与 JNI 一起使用 我搜索过示例但找不到任何示例 如何将 JNI 库静态链接到我的 java 应用程序中 Java SE 8规范已
  • jni 和在 java 中使用 c++ new'ed 对象

    我有一个与数据库对话的 C 层 这个 C 层执行一个新的 SomeObject 并将其返回给 java 我什么时候可以安全地通过 clean jni 调用删除 SomeObject 我可以在java返回对象后立即删除还是需要复制该对象然后删
  • JNI 和 Java:ant 调用 make 还是 make 调用 ant?

    我即将第一次进入 JNI Java 本机接口 的世界 以提供从平台特定的 C C 代码到 Java 的文件系统更改通知 除非有人推荐一些我错过的出色的图书馆来做这件事 作为 JNI 的新手 我已经设法找到了很多关于 JNI 接口方面和库生成
  • Linux 上的 JDK 1.8 缺少 JNI 包含文件

    我正在尝试编译以下项目 https github com entropia libsocket can java 我总是收到此错误消息 有谁知道如何修复它 这可能是 Linux x64 Debian Wheezy 上 JDK 1 8 0 1
  • Android - setRequestedOrientation - 活动和视图生命周期

    我在使用 JNI 的本机代码方面遇到了一些问题 我怀疑这可能是由于调用setRequestedOrientation 当我打电话时活动会发生什么setRequestedOrientation 是刚刚重新启动还是完全被破坏了 另外 视图会发生
  • JAVA JNI C 调试器

    是否有任何调试器可以帮助调试 Java JNI 程序以及 C 库 我应该能够在Java中从static void main开始调试程序 并继续调试并在本机c函数中放置断点 然后在控制权从C转移到Java后继续在Java中调试 Java 虚拟
  • 生成 Java JNI 标头

    我想做的就是使用 JDK Javah exe 程序生成 JNI 头文件 但无论我尝试什么 我都会收到错误消息 错误 找不到 ddg ndkTest NativeLib 的类文件 其中 ddg ndkTest 是命名空间 NativeLib
  • 如何链接 ndk 应用程序中的任何库

    From 本教程 http marakana com forums android examples 49 html 看到我有一个预构建的静态库 名为stackoverflow a它有stackoverflow h 现在我想使用该静态库的功
  • 如何通过 JNI 将本机枚举公开给 Java?

    我正在从现有项目导入标头以将端口移植到 Android NDK 在某些情况下 我想在 Java 层使用本机标头中定义的枚举 怎样才能做到这一点呢 理想情况下 我想以某种方式将常量公开给 Java 层 但我没有找到这样做的方法 最明显的可能性
  • C 与 C++ 中的 JNI 调用不同?

    所以我有以下使用 Java 本机接口的 C 代码 但是我想将其转换为 C 但不知道如何转换 include
  • 从 jar 加载 .so 文件

    我用 C 语言创建了一个库 并使用 JNI 从 Java 调用它 因此我有我的包和一个包含 libMYLIB so 文件的 lib 文件夹 我记得在Java写作中 static System loadLibrary MYLIB 如果我使用选
  • 如何获取.so文件的依赖项列表?

    假设我有libFoo so为 android arm 编译 我不确定它链接到什么STL实现 有options http developer android com intl ru ndk guides standalone toolchai

随机推荐

  • Twilio 通过 REST API 挂断呼叫不起作用?

    当呼叫状态为排队状态 正在振铃或已发起 时 如何挂断电话 下面的代码对呼叫没有任何影响 呼叫会继续响铃 直到听筒接听 有时 当座席意识到他们拨打了错误的号码时 他们需要一种方法在响铃过程中挂断呼叫 PHP code client gt ca
  • Android studio中的文件路径

    我正在尝试发送带有附件的电子邮件 除了附加文件之外 一切正常 调用方法时 它显示 java io FileNotFoundException 虽然我手动插入精确路径 文件 存储 模拟 0 Android data com example a
  • 查找一对 QuadCurve2D 的交集

    有没有一种简单的方法来近似两个实例的点 如果有 QuadCurve2D相交 也就是说 我如何计算图中红点的坐标 没有明显的方法QuadCurve2D去做这个 注意 这些点并不准确 因为我已经为图表手动调整了它们 另请注意 缺失 的第四个点
  • 我应该避免使用管道运算符对包进行编程吗?

    有没有客观原因管道操作员 https cran r project org web packages magrittr vignettes magrittr html来自 R 包magrittr 例如 gt 当我在 R 中编写包时应该避免吗
  • 波兰表示法的实现

    我想编写一个程序来计算给定算术表达式的输出 像那样 我的输入是 1 2 3 4 5 6 我的输出应该是 156 我编写了一个 Java 程序来使用 Stack 数据类型来执行此操作 这是我的 Java 程序 import java util
  • 防止 ejs for 循环中出现空行

    我有以下简单的 ejs 模板 这会产生以下结果 0 1 2 3 4 5 6 7 8 9 如何防止 ejs 创建这样的空行 如果可能的话 我不想修改结果字符串 而是告诉 ejs 不要渲染这些空行 我怎样才能做到这一点 修剪模式 newline
  • 张量流中的正则化损失是什么?

    当使用 Tensorflows 对象检测 API 训练对象检测 DNN 时 它的可视化平台 Tensorboard 会绘制一个名为regularization loss 1 这是什么 我知道什么是正则化 使网络善于通过各种方法 例如 dro
  • GreenDAO支持表之间的多种关系

    我一直在尝试使用 GreenDAO 创建数据库模型 当我尝试在不同表之间创建多个关系时 问题就开始了 基本上 我有一个Message桌子 一个Conversation表和一个User table 用户有一个消息列表 并且该消息有一个父对话
  • printf 命令导致段错误? [复制]

    这个问题在这里已经有答案了 当我尝试初始化一个大型的二维字符数组时 它工作得很好 但是当我添加一个简单的打印命令时 它给了我一个分段错误 关于为什么会发生这种情况有什么想法吗 include
  • 如何将 Zlib 与 Cmake 链接

    我试图将我的文件与 zlib 库链接 但仍然得到 对 deflateInit 的未定义引用 我目前正在使用CLion 已从主页下载了zLib文件并将其添加到项目中 这就是我的 CmakeLists txt 的样子 cmake minimum
  • 查找通过代理连接的客户端的IP地址

    有没有办法收集通过代理服务器连接到您网站的客户端的 IP 地址 整个设置是一个内部 LAN 通过系统管理员 我也可以控制代理计算机 我在网站服务器端使用 PHP5 I tried SERVER REMOTE ADDR 在 PHP 中 但此变
  • 处理 Mongoose 中的架构更改

    随着应用程序的发展 更新 迁移 Mongoose 模式的最佳实践 或工具 是什么 有趣的是 MongoDB 的诞生就是为了解决 RDBMS 中的模式问题 您不必迁移任何内容 您所要做的就是在架构定义中设置默认值 如果该字段是必需的 new
  • 如何管理 MySQL Workbench 中的 SQL 选项卡?

    我经常需要的每个项目都有多个 SQL 查询 我的问题是 我的所有项目都需要 Workbench 中相同的 MySQL 连接 所以我一直打开大量的 SQL 选项卡 如下所示 由于选项卡的数量超过了显示器的宽度 因此我必须左右滚动才能找到一些查
  • 无法使用 String#trim 作为 Array#map 的回调

    由于某种原因我无法使用String prototype trim call作为数组方法的回调 例如map or filter 在这种情况下 两个函数的工作原理相同 function trim string return string tri
  • 在 MySQL WorkBench 中打开现有数据库

    I got a DB files that created in My SQL and I want open them in My SQL WorkBench 6 1 The files I got contains FRM MYD MY
  • 查找数组中的最小值和最大值

    所以我试图找到用户输入的数组的最小值和最大值 这是我的代码 public static void main String args int a new int args length for int i 0 i lt args length
  • 匹配两个数据集中的 ID

    我有两组数据 包括前数据和后数据 受访者拥有唯一的 ID 我想创建一个子集 其中仅包含对两项调查做出回应的受访者 数据集示例 pre data lt data frame ID c 1 10 Y sample c yes no 10 rep
  • 有什么好的 CMS 可以与现有的 Java 网站集成(需要良好的 API)[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我们有一个大型现有网站 用 Java Spring Hibernate JSP 编写 并希望添加一个内容
  • 提交表单时不要包含空参数

    我的控制器上的索引方法如下所示 public ActionResult Index string search string sort int groupId 对于搜索功能 我有以下形式 using Html BeginForm div H
  • jni 和在 java 中使用 c++ new'ed 对象

    我有一个与数据库对话的 C 层 这个 C 层执行一个新的 SomeObject 并将其返回给 java 我什么时候可以安全地通过 clean jni 调用删除 SomeObject 我可以在java返回对象后立即删除还是需要复制该对象然后删