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

Is it possible to implement a Java Interface in C or C++ using JNI?

本文关键字:C++ 实现 Java 接口 可以使 JNI 是否      更新时间:2023-10-16

假设一个包含类的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(),并在 C 中调用integerGenerated()

我已经研究了 JNI 的RegisterNatives(),但我相信这将需要 Java 代码声明和调用"本机"方法(如果我错了,请纠正我),而且我没有修改现有 Java 库的奢侈。另请注意,这里只是使用简单的 Java 库来举例说明我的问题。我意识到如此简单的功能可以在本机轻松编写。

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

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

现在只需使用 javah 创建头文件并实现函数。