将 std::unique_ptr 传递给 JNI

wil*_*ome 5 c++ java java-native-interface unique-ptr c++11

我正在用 JNI 包装一些 C++ 代码,并偶然发现了以下工厂函数:

std::unique_ptr<MetricPlanner> create_metric_planner(*arguments*)
Run Code Online (Sandbox Code Playgroud)

我需要将对该函数创建的计划器的引用传递回 Java 以供以后使用,但我对 a) 如何将其传递回去感到困惑,以及 b) 一旦传递它会发生什么。

通常,我一直这样通过:

Director *DIRECTOR = new Director(arguments);
return (jlong)DIRECTOR;
Run Code Online (Sandbox Code Playgroud)

它的作用就像一个魅力。

当使用返回此类指针的工厂函数而不是普通构造函数时,有人可以解释使用 JNI 引用对象的类似过程吗?

Pra*_*ian 3

由于您要将函数的返回值传递create_metric_planner给 Java,然后在稍后使用它,因此您不希望unique_ptr在其作用域结束时销毁返回值。为此,您必须致电unique_ptr::release.

return (jlong)create_metric_planner( ... ).release();
Run Code Online (Sandbox Code Playgroud)

不要忘记,在某些时候,当您使用完该函数返回的对象后,您必须使用delete它(或调用您正在使用的库提供的某些删除器函数)。