クラスを含むJavaライブラリを想定して、それを呼び出しましょうFoo
。このクラスには、コンストラクターと 2 つのメソッドが含まれています。
// constructor
Foo();
// returns a random int
public int bar();
// generates a random int "x" and calls integerGenerated(x)
public void generateInt(IntGeneratorListenerInterface listenerInterface);
IntGeneratorListenerInterface
これは、 1 つのメソッドを持つJava インターフェイスを想定しています。
void integerGenerated(int generatedInt);
bar()
ネイティブ C および C++ から呼び出すことができます。が適切に初期化されていると仮定した C++ の例を次に示しますJNIEnv
env
。
// instantiate Foo
jclass fooClass = env->FindClass("com/my/package/Foo");
jmethodID constructorMethodID = env->GetMethodID(fooClass, "<init>", "()V");
jobject fooInstance = env->NewObject(fooClass, constructorMethodID);
// call bar()
jmethodID barMethodID = env->GetMethodID(fooClass, "bar", "()I");
jint result = env->CallIntMethod(fooInstance, barMethodID);
printf("%d", result);
私がやりたいのはIntGeneratorInterface
、C/C++ からインターフェイスを実装して、generateInt()
同様の JNI 呼び出しを使用して呼び出したときに、次のように C でコールバックを受信できるようにすることです。
void integerGenerated(int x)
{
// do something with the int
}
私の質問:generateInt()
Java インターフェースを C/C++ で実装して、有効なものを に渡しintegerGenerated()
、C で呼び出すことができる方法はありますか?
私は JNI のRegisterNatives()
. また、私の質問を例示するために、ここでは簡単なJavaライブラリが使用されていることに注意してください。このような単純な機能は、ネイティブでも同じように簡単に記述できることに気付きました。