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

ari*_*nte 4 java-native-interface

我有一个与db对话的c ++层,这个c ++层执行一个新的SomeObject()并将它返回给java.

什么时候通过我干净的jni调用删除SomeObject是安全的.只要java有返回的对象,我是否可以删除,还是需要复制对象然后删除?

Jea*_*let 9

正如Daff所写,你不能"将一个C++对象返回给Java",但你能做的就是返回对象的地址,如下所示:

jlong obj_ptr = reinterpret_cast<jlong>( &obj );
Run Code Online (Sandbox Code Playgroud)

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

#include <boost/static_assert.hpp>
BOOST_STATIC_ASSERT(sizeof(jlong)>=sizeof(void *));
Run Code Online (Sandbox Code Playgroud)

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

  • 不再需要我离开了我需要做的这个可怕的公司. (5认同)