假设一个包含类的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);
我可以从本地C和C ++中调用bar()
。这是一个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);
我想要做的是从C / C ++实现接口IntGeneratorInterface
,这样当我使用类似的JNI调用调用generateInt()
时,我可以在C中接收回调,如:
void integerGenerated(int x)
{
// do something with the int
}
我的问题:有没有办法在C / C ++中实现Java接口,这样我就可以将有效的内容传递给generateInt()
,并调用integerGenerated()
C 1
我已经查看了JNI的RegisterNatives()
,但我相信这需要Java代码来声明并调用“本机”方法(如果我错了请纠正我),而且我没有奢侈品修改现有的Java库。另请注意,这里使用简单的Java库来举例说明我的问题。我意识到这样简单的功能可以像原生一样轻松编写。
答案 0 :(得分:3)
是。就像使用任何其他本机方法一样:
class NativeRunnable implements Runnable {
@Override
public native void run();
}
现在只需使用javah
创建头文件并实现该功能。