C ++ shared_ptr和Java本机对象所有权

时间:2014-10-15 05:39:22

标签: java c++11 java-native-interface shared-ptr

在将功能从C ++库暴露给Java时,我最近遇到了关于C ++ shared_ptr指针的问题。这种情况是,Object本身以及与该Object相关的jlong句柄都存在于Java部分中,但后续结构使用智能指针访问该Object。

我得到的问题是:当智能指针被破坏或重置时,底层对象也会被删除。但是Java引用仍指向该Object。

我尝试了很多,但我没有设法保持Java端的所有权。是否有针对该问题的最佳实践或解决方案?

3 个答案:

答案 0 :(得分:4)

如果你想保留对象,只要Java继续引用它,这是有用的模式:

jlong Java_xxx_getNativeRef(...)
{
    std::shared_ptr<MyObject> *pNew = new std::shared_ptr<MyObject>;
    *pNew = whatever-you-do to obtain an std::shared_ptr<MyObject>;
    return reinterpret_cast<jlong>(pNew);
}

Java_xxx_releaseNativeRef(..., jlong nativeRef)
{
    std::shared_ptr<MyObject> *pSp = reinterpret_cast<std::shared_ptr<MyObject> *>(nativeRef);
    pSp->clear();
}

另一方面,如果您担心Java引用可能因为它超过本机对象的生命周期而变得无效,但是不希望Java控制MyObject的发布,那么您可以使用相同的技巧std::weak_ptr

答案 1 :(得分:1)

shared_ptr 完全关于管理所有权。如果你想管理java方面的所有权,我实际上不会使用shared_ptr。

作为一个黑客,你可以将shared_ptr与自定义删除器一起使用,实际上删除对象。

答案 2 :(得分:0)

智能指针通常与分配/释放有关,而shared_ptr也不例外。如果想要引用对象而不关心分配,请使用引用或指针。

您是否有特定原因无法使用普通指针执行任务?