当前位置: 首页 > 知识库问答 >
问题:

使用JNI将C类成员函数绑定到Java

萧业
2023-03-14

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

但是当我试图绑定一个C类成员函数Java回调不会被调用。

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

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

Java函数如下所示。

public native void onCall(int a);

我试图绑定的本机函数与我的注册本地方法调用在同一个类中。下面是我如何使用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函数来绑定函数指针,但它不起作用。

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

共有1个答案

羊和光
2023-03-14

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

 类似资料:
  • C++ 类 & 对象 类的成员函数是指那些把定义和原型写在类定义内部的函数,就像类定义中的其他变量一样。类成员函数是类的一个成员,它可以操作类的任意对象,可以访问对象中的所有成员。 让我们看看之前定义的类 Box,现在我们要使用成员函数来访问类的成员,而不是直接访问这些类的成员: class Box { public: double length; // 长度

  • 主要内容:在类体中和类体外定义成员函数的区别类可以看做是一种数据类型,它类似于普通的数据类型,但是又有别于普通的数据类型。类这种数据类型是一个包含成员变量和成员函数的集合。 类的成员变量和普通变量一样,也有数据类型和名称,占用固定长度的内存。但是,在定义类的时候不能对成员变量赋值,因为类只是一种数据类型或者说是一种模板,本身不占用内存空间,而变量的值则需要内存来存储。 类的成员函数也和普通函数一样,都有返回值和参数列表,它与一般函数的区别是

  • 想象一下我有一个POJO,比如: 如果我需要使用bind()方法将name成员绑定到JavaFX标签,我不能应用,因为我需要一个可观察值。 我知道我可以使用StringProperty代替String,但是我需要基本类型,因为我使用Hibernate,我不知道Hibernate是否可以支持JavaFX的属性来映射DB中的数据。 我必须将哪些备选方案从我的 pojo 绑定到 JavaFX 控件?

  • 我有一个问题,我想在下面的代码中专门化模板类的模板成员函数。这个问题的答案是模板类成员函数的显式特化,这似乎表明它无法完成。这是正确的吗,如果是这样,我可以使用任何解决方法,以便在编译时通过内联inc函数进行扩展? 非常感谢! g吐槽道: test2.cpp:32:13: 错误: 非命名空间作用域中的显式专用化 'struct IdxIterator' test2.cpp:32:25: 错误: 非

  • 员函数调整客户的银行借贷(例如 BanLAccount 类的 private 数据成员)。 类通常提供 public 成员函数,让类的客户设置(写入)或读取(取得) private 数据成员的值。这些函数通常称为get和set。更具体地说,设置数据成员interestRate的成员函数通常称为setInterestRate,读取数据成员IntersetRate的值通常称为 getInterestR

  • 文档和快速引用可以在sample_for_tests.h和SampleForTests.java找到。 Overview On other platforms, the underlying system / platform APIs (win32, cocoa, gtk) are directly accessible via C/C++. On Android, the underlying