gpt4 book ai didi

java-native-interface - jni 和在 Java 中使用 C++ 新对象

转载 作者:行者123 更新时间:2023-12-04 23:09:59 25 4
gpt4 key购买 nike

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

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

最佳答案

正如 Daff 所写,你不能“将 C++ 对象返回给 Java”,但你可以做的是返回对象的地址,作为一个长:

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

您应该确保在根 header 中的某处 jlong​​ 的大小足以容纳指针(通常应该如此,因为 Java long 是 64 位宽)。我使用 Boost 的静态断言来检查这个:
#include <boost/static_assert.hpp>
BOOST_STATIC_ASSERT(sizeof(jlong)>=sizeof(void *));

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

关于java-native-interface - jni 和在 Java 中使用 C++ 新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3095497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com