假设一个 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调用?
我研究过 JNIRegisterNatives()
,但我相信这需要 Java 代码声明并调用“本机”方法(如果我错了,请纠正我),而且我没有修改现有 Java 库的奢侈。另请注意,这里仅使用简单的 Java 库来举例说明我的问题。我意识到这样简单的功能可以很容易地在本地编写。