如何为Java接口创建JNI?

时间:2017-09-14 18:00:42

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

如何为Java接口创建JNI,以便我可以在c ++代码中从接口调用函数?

具体来说,我有一个Java接口

public interface Foo {
    public void Bar(int a);
}

我试图为其创建一个JNI JFoo.h:

class JFoo {
    ...
    public: 
        void Bar(int a);
    ...
};

JFoo.c:

...
void JFoo::Bar(int a) {
    //Not sure what to put here. If I don't have then I have issues because 
    "declaration of 'void JFoo::Bar(int)' outside of class is not 
    definition"
    return;
} 
...

所以我可以从另一个C ++文件

JFoo foo123;
foo123 = ... //the Java object which implements the Foo interface is what actually passes in 'foo123'
foo123.bar(5); //This ideally executes the Java object's implementation of bar

我还尝试在JFoo中使用virtual void而不是拥有一个抽象的c ++类,但这不起作用,因为你“不能将字段'foo123'声明为抽象类型”。

如何为Java界面创建JNI?

2 个答案:

答案 0 :(得分:1)

JNI用于实现实例(没有static)或类(static)方法。方法实现意味着一个具体的方法,即使该类包含其他抽象方法。接口的方法完全是抽象的。

语言文档指出nativeclass declaration中方法的允许修饰符,但不适用于interface declaration。编译器还会告诉您不能放置native的位置。

答案 1 :(得分:0)

嗯,它不会那样:(

你不能这样。 JNI允许您通过JNI实现中提供的函数调用本机方法和操作Java对象。但它与一对一的映射无关。

看看这里:http://jnicookbook.owsiak.org/recipe-no-027/

此示例显示如何从C ++调用类的方法。