我有一个与数据库对话的 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(使用前将#替换为@)