【发布时间】:2018-11-28 08:02:11
【问题描述】:
我有一个 cpp 函数指针:
using MyclassPtr = std::shared_ptr<Myclass>;
using UpdateCallback = std::function<void(const MyclassPtr&)>;
现在在java中我有一个接口:
public interface UpdateCallback {
void OnDataUpdate(MyClass data);
}
要求 cpp 库应将自身添加为 java 事件的侦听器。因此,如果发生,cpp 将调用 setUpdateCallback(UpdateCallback) 将自身作为回调添加到应用程序事件中。
JNI 方法:
void MyCustomClassJNI::setUpdateCallback(const UpdateCallback & callback)
{.......}
如何从cpp中获取函数指针并与接口映射,这样当应用类调用接口方法时,调用cpp函数回调??
请帮忙。
【问题讨论】:
-
创建一个包含
long成员变量的UpdateCallback实现。在您的 C++ 代码中,您可以创建该类的实例并将long字段设置为std::function实例的地址。然后,Java 的OnDataUpdate方法可以调用native函数,该函数检索long字段,将其转换回std::function指针,然后调用该函数。 -
@Michael:如何获取std::function的地址,然后转回std::function?
-
reinterpret_cast<jlong>(&callback),reinterpret_cast<UpdateCallback*>(java_long_value). -
您的
void OnDataUpdate(MyClass data);实际上是将MyClass data对象传递给JNI。这个data应该是对你的 C++ 层有意义的对象,而不是向下传递回调接口指针。
标签: java android c++ java-native-interface jnienv