7

假设一个包含一个类的 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 库来举例说明我的问题。我意识到这样简单的功能可以很容易地在本地编写。

4

1 回答 1

4

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

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

而现在只是javah用来创建头文件并实现功能。

于 2013-09-19T20:11:55.597 回答