【问题标题】:Binding a C++ class member function to Java using JNI使用 JNI 将 C++ 类成员函数绑定到 Java
【发布时间】:2017-02-23 04:10:23
【问题描述】:

我正在尝试使用 JNI RegisterNatives 将本机函数绑定到 Java。如果该函数在全局范围内,我可以轻松地绑定该函数并且它可以正常工作。

但是当我尝试将 C++ 类成员函数绑定到 Java 时,不会调用回调。

我的 C++ 函数的声明是这样的:

void native_onCall(JNIEnv* env, jobject obj, jint val)

Java 函数如下所示。

public native void onCall(int a);

我尝试绑定的本机函数与我的 RegisterNatives 方法调用在同一个类中。这是我如何使用 typedef 定义函数指针并将其添加到 JNINativeMethod 结构的 sn-p。

typedef void (MyClass::*func_pointer)(JNIEnv*, jobject, jint);
func_pointer cbptr;

JNINativeMethod[index].name = const_cast<char*>("onCall");
JNINativeMethod[index].signature = const_cast<char*>("(I)V");
JNINativeMethod[index].fnPtr = (void*)cbptr;

env->RegisterNatives(jclass, JNINativeMethod, index);

我还使用了 std::bind 和 lambda 函数来绑定函数指针,但它不起作用。

如果有人能指出一种使用 JNI 将类成员函数绑定到 java 的方法,或者我在这里做错了什么,那将非常有帮助。

【问题讨论】:

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


    【解决方案1】:

    显然使用实例成员函数不是解决这个问题的方法。 通过使用静态函数,我设法处理了类内的调用。

    【讨论】:

    • 是的。将 Java 本地方法绑定到 C++ 类的非静态方法很棘手:您将使用哪个实例?
    • @AlexCohn 我在类中使用了静态方法,并在方法中使用了类的静态实例来完成工作。我把这个类基本上变成了一个单例,并稍微改变了其余代码的设计以使用这个单例。
    猜你喜欢
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多