在向 Java 公开 C++ 库的功能时,我最近遇到了一个关于 C++ shared_ptr
指针的问题。这种情况是对象本身以及与该对象相关的 jlong
句柄存在于 Java 部分中,但后续结构使用智能指针访问该对象。
我遇到的问题是:当智能指针被销毁或重置时,底层对象也会被删除。然而,Java 引用仍指向该对象。
我尝试了很多,但我没能保持 Java 端的所有权。是否有针对该问题的最佳实践或解决方案?
最佳答案
如果您希望在 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
}
另一方面,如果您担心 Java 引用可能会因为它超过 native 对象的生命周期而变得无效,但又不想让 Java 控制 MyObject 的释放,您可以使用 std::weak_ptr
.
关于java - C++ shared_ptr 和 Java native 对象所有权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26375215/