将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&lt;jlong&gt;(&amp;callback), reinterpret_cast&lt;UpdateCallback*&gt;(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接口方法的主要内容,如果未能解决你的问题,请参考以下文章

如何将地址转换为函数指针以调用方法

在Golang中将结构指针转换为接口指针

将成员函数指针转换为 FreePascal 中的函数指针

在cpp的静态函数中访问这个指针

C++:将派生指针转换为 void 指针,然后转换为抽象指针,并访问成员函数

将 void 指针(数据)转换为函数指针