java - 使用 JNI 将 C++ 类成员函数绑定(bind)到 Java

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

我正在尝试使用 JNI RegisterNatives 将 native 函数绑定(bind)到 Java。如果该函数在全局范围内,我可以轻松地绑定(bind)该函数并且它可以毫无问题地工作。

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

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

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

Java 函数如下所示。

public native void onCall(int a);

我尝试绑定(bind)的 native 函数与我的 RegisterNatives 方法调用在同一个类中。这是我如何使用 typedef 定义函数指针并将其添加到 JNINativeMethod 结构的片段。

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 函数来绑定(bind)函数指针,但它不起作用。

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

最佳答案

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

关于java - 使用 JNI 将 C++ 类成员函数绑定(bind)到 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42406875/

相关文章:

c++ - 在 Windows 上构建 MongoDB C++ 驱动程序

c - 为什么这个版本的 C 中的逻辑与不显示短路行为?

c - C中大数的问题

java - 无法使用 AWS EMR 实例通过 spark 访问 JDBC 驱动程序

c++ - 循环分割性能问题

java - 使用 CXF 生成的客户端时意外的包装器元素

c++ - OSX + 离屏渲染 + CoreGL + 帧缓冲区 + 着色器 = 头痛?

c - memcpy() 函数的段错误

java - 为什么 Java 中的局部变量(包括基元)必须始终进行初始化?

java - 如何在未安装 MySQL 的计算机上运行使用 MySQL DB 的 Java 应用程序?