C++;共享的ptr和Java本机对象所有权 P.从C++库到java的功能暴露,C++面临着一个关于C++ >代码> SyddYPPT/指针的问题。这种情况是,对象本身以及与该对象相关的jlong句柄位于Java部分,但后续结构使用智能指针访问该对象

C++;共享的ptr和Java本机对象所有权 P.从C++库到java的功能暴露,C++面临着一个关于C++ >代码> SyddYPPT/指针的问题。这种情况是,对象本身以及与该对象相关的jlong句柄位于Java部分,但后续结构使用智能指针访问该对象,java,c++11,java-native-interface,shared-ptr,Java,C++11,Java Native Interface,Shared Ptr,我遇到的问题是:当智能指针被破坏或重置时,底层对象也会被删除。但是Java引用仍然指向该对象 我做了很多尝试,但是我没有在Java方面保持所有权。对于这个问题有什么最佳实践或解决方案吗?共享\u ptr正是关于管理所有权的。如果您想在java端管理所有权,我实际上不会使用shared_ptr 作为黑客,您可以将shared\u ptr与自定义删除器一起使用,该删除器不会实际删除对象。智能指针通常与分配/解除分配有关,shared\u ptr也不例外。如果希望引用对象而不关心分配,请使用引用或指针

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


我做了很多尝试,但是我没有在Java方面保持所有权。对于这个问题有什么最佳实践或解决方案吗?

共享\u ptr正是关于管理所有权的。如果您想在java端管理所有权,我实际上不会使用shared_ptr


作为黑客,您可以将shared\u ptr与自定义删除器一起使用,该删除器不会实际删除对象。

智能指针通常与分配/解除分配有关,shared\u ptr也不例外。如果希望引用对象而不关心分配,请使用引用或指针


有没有特定的原因使您不能在任务中使用普通指针?

如果您希望在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);
    delete *pSp;
    delete pSp; // thanks @LucasZanella
}
jlong Java_xxx_getNativeRef(…)
{
std::shared_ptr*pNew=新std::shared_ptr;
*pNew=为获得std::shared\u ptr所做的一切;
返回重新解释(pNew);
}
Java_xxx_releaseNativeRef(…,jlong nativeRef)
{
std::shared_ptr*pSp=reinterpret_cast(nativeRef);
删除*pSp;
删除pSp;//谢谢@LucasZanella
}

另一方面,如果您担心Java引用可能会变得无效,因为它超过了本机对象的生命周期,但又不想让Java控制MyObject的发布,那么您可以使用
std::weak_ptr

执行同样的操作,这是正确的,我完全同意,但是,应该说我不能改变C++代码,但只能改变java方面。原因是我不能改变底层库。你是说<代码> RealTytCase增加了<代码> SyddYPPTR <代码>的引用计数吗?否则,这将不起作用,因为从
Java\u xxx\u getNativeRef()
退出时,引用计数将降至零。请注意,我获得了指向共享指针的GOP(旧指针)。这样,当它离开get的范围时,它仍然没有被破坏。@AlexCohn我是这样做的:直到你想到了一个简单的GOP。显然更好:)@AlexCohn什么是清楚的?
std::shared\u ptr
中没有明确的方法?你又对了。要记住我5年前的确切想法并不容易。表面上看,这应该是
delete*pSp