【问题标题】:Converting cpp function pointer to java interface methods将cpp函数指针转换为java接口方法
【发布时间】: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++ 层有意义的对象,而不是向下传递回调接口指针。

标签: java android c++ java-native-interface jnienv


【解决方案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 的建议以类似的方式进行
猜你喜欢
  • 2019-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
  • 2012-11-21
  • 2015-01-26
相关资源
最近更新 更多