2017-02-23 6 views
0

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にバインドする方法を指摘できる人、または私がここで間違っていることは本当に役に立ちます。

答えて

2

明らかに、インスタンスメンバー関数を使用することは、これを行う方法ではありません。 静的関数を使用することで、クラス内の呼び出しを処理することができました。

+1

真。 JavaのネイティブメソッドをC++クラスの非静的メソッドにバインドするのは難しいです:どのインスタンスを使用しますか? –

+2

@AlexCohn私は、クラス内で静的メソッドを使用し、そのメソッド内でクラスの静的インスタンスを使用して、その作業を完了させました。私はクラスを基本的にシングルトンにし、この単一のインスタンスを使用するために残りのコードのデザインを少し変更しました。 –

関連する問題