ari*_*nte 4 java-native-interface
我有一个与db对话的c ++层,这个c ++层执行一个新的SomeObject()并将它返回给java.
什么时候通过我干净的jni调用删除SomeObject是安全的.只要java有返回的对象,我是否可以删除,还是需要复制对象然后删除?
正如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完全没有意识到它的存在,并且所有关于手动内存管理的警告都适用......
| 归档时间: |
|
| 查看次数: |
2266 次 |
| 最近记录: |