将cpp函数指针转换为java接口方法
Posted
技术标签:
【中文标题】将cpp函数指针转换为java接口方法【英文标题】:Converting cpp function pointer to java interface methods 【发布时间】: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++ 层有意义的对象,而不是向下传递回调接口指针。
【参考方案1】:
您的void OnDataUpdate(MyClass data);
实际上是将MyClass
数据对象传递给JNI。
可能MyClass
data 应该是对您的 C++ 层有意义的对象,而不是向下传递回调接口指针。
从 Java 端
// Java code
public class MyCustomClassJNI implements UpdateCallback
public native void notifyJni(MyClass data);
@Override
void OnDataUpdate(MyClass data)
this.notifyJniPeer(data);
那么在 C++ 端,你应该有一个 JNI 方法,如下所示:
JNIEXPORT void JNICALL
Java_your_package_name_MyCustomClassJNI_notifyJni(JNIEnv *env, jobject myClassData)
// read myClassData object.
【讨论】:
非常感谢。按照 u & Michael 的建议以类似的方式进行以上是关于将cpp函数指针转换为java接口方法的主要内容,如果未能解决你的问题,请参考以下文章