JNI RegisterNativesを使用してネイティブ関数をJavaにバインドしようとしています。関数がグローバルスコープにある場合は、関数を簡単にバインドすることができ、問題なく動作します。JNIを使用してJavaにC++クラスメンバー関数をバインド
しかし、私はC++クラスメンバ関数をJavaにバインドしようとしているとき、コールバックは呼び出されません。
私のC++の関数の宣言は、このようなものです:
void native_onCall(JNIEnv* env, jobject obj, jint val)
Java関数は次のようになります。
public native void onCall(int a);
バインドしようとしているネイティブ関数は、私の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関数を使用しましたが、動作しません。
誰かが、JNIを使ってクラスメンバ関数をJavaにバインドする方法を指摘できる人、または私がここで間違っていることは本当に役に立ちます。
真。 JavaのネイティブメソッドをC++クラスの非静的メソッドにバインドするのは難しいです:どのインスタンスを使用しますか? –
@AlexCohn私は、クラス内で静的メソッドを使用し、そのメソッド内でクラスの静的インスタンスを使用して、その作業を完了させました。私はクラスを基本的にシングルトンにし、この単一のインスタンスを使用するために残りのコードのデザインを少し変更しました。 –