是否可以使用JNI在C或C ++中实现Java接口?

时间:2013-09-19 20:07:20

标签: c++ c java-native-interface

假设一个包含类的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库来举例说明我的问题。我意识到这样简单的功能可以像原生一样轻松编写。

1 个答案:

答案 0 :(得分:3)

是。就像使用任何其他本机方法一样:

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

现在只需使用javah创建头文件并实现该功能。