7

クラスを含む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ライブラリが使用されていることに注意してください。このような単純な機能は、ネイティブでも同じように簡単に記述できることに気付きました。

4

1 に答える 1

4

はい。他のネイティブ メソッドと同じように:

class NativeRunnable implements Runnable {
    @Override
    public native void run();
}

そしてjavah、ヘッダーファイルを作成して関数を実装するために使用します。

于 2013-09-19T20:11:55.597 に答える