繁体   English   中英

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

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

假设一个包含类的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创建头文件并实现该功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM