java - C++ shared_ptr 和 Java native 对象所有权

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

在向 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/

相关文章:

c++ - 泛化模型中的数据访问。避免宏的方法?

c++ - 如何解决 "Didn' t 在路径 : DexPathList in my native callback to Java 上找到类 "..."

java - 网络中断后http会恢复吗?

c++11 - 链接错误 : multiple definition of static variable

java - 从 URL 中提取数据以用于 selenium 测试

c++ - 尝试根据另一个 vector 对一个 vector 进行排序时出现不一致

java - 使用接口(interface)在 JNI 中实现回调函数

java - JNI - 自动将所有新生成的线程从进程附加到 JVM?

java - 不使用注释创建自定义 Java 编译器错误

java - Java 中守护线程和非守护线程的优先级