假设一个包含一个类的 Java 库,让我们调用它Foo
。该类包含一个构造函数和两个方法:
// constructor
Foo();
// returns a random int
public int bar();
// generates a random int "x" and calls integerGenerated(x)
public void generateInt(IntGeneratorListenerInterface listenerInterface);
这假定 Java 接口IntGeneratorListenerInterface
具有一种方法:
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
}
我的问题:有什么方法可以在 C/C++ 中实现 Java 接口,这样我就可以将有效的东西传递给generateInt()
,并integerGenerated()
在 C 中调用?
我已经研究过 JNI RegisterNatives()
,但我相信这需要 Java 代码来声明和调用“本机”方法(如果我错了,请纠正我),而且我没有修改现有 Java 库的奢侈。另请注意,这里仅使用琐碎的 Java 库来举例说明我的问题。我意识到这样简单的功能可以很容易地在本地编写。