Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
绑定一个C++;使用JNI将成员函数类化为Java_Java_C++_C_Java Native Interface - Fatal编程技术网

绑定一个C++;使用JNI将成员函数类化为Java

绑定一个C++;使用JNI将成员函数类化为Java,java,c++,c,java-native-interface,Java,C++,C,Java Native Interface,我正在尝试使用JNI注册表项将本机函数绑定到Java。如果函数在全局范围内,我可以轻松地绑定函数,并且它可以正常工作 但是当我试图把C++类成员函数绑定到java时,调用回不被调用。 注册表项(jclass、jniationMethod、index); 我还使用std::bind和lambda函数来绑定函数指针,但它不起作用 如果有人能指出一种使用JNI将类成员函数绑定到java的方法,或者我在这里所做的错误,那将非常有帮助。显然,使用实例成员函数并不是解决这个问题的方法。 通过使用静态函数,

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

<>但是当我试图把C++类成员函数绑定到java时,调用回不被调用。 <我的C++函数的声明是这样的:

void native_onCall(JNIEnv* env, jobject obj, jint val)
Java函数如下所示

public native void onCall(int a);
我试图绑定的本机函数与我的RegisterNatives方法调用在同一个类中。下面是我如何使用typedef定义函数指针并将其添加到jniationalMethod结构的一个片段

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);
typedef void(MyClass::*函数指针)(JNIEnv*,jobject,jint);
函数指针cbptr;
jniationalMethod[index].name=const_cast(“onCall”);
jniationalMethod[index].signature=const_cast(“(I)V”);
JnitiveMethod[index].fnPtr=(void*)cbptr;
环境->注册表项(jclass、jniationMethod、index);
我还使用std::bind和lambda函数来绑定函数指针,但它不起作用


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

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

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

对。将java原生方法绑定到C++类的非静态方法很棘手:您将使用哪个实例?@ AlxCoHn。我在类中使用静态方法,并使用方法中类的静态实例来完成工作。我使这个类基本上是一个单实例,并稍微改变了代码其余部分的设计,以使用这个单实例。将java原生方法绑定到C++类的非静态方法很棘手:您将使用哪个实例?@ AlxCoHn。我在类中使用静态方法,并使用方法中类的静态实例来完成工作。我使这个类基本上是一个单实例,并稍微改变了代码其余部分的设计,以使用这个单实例。