2017-09-14 77 views
-1

如何爲Java接口創建JNI以便我可以從C++代碼中的接口調用函數?如何爲Java接口創建JNI?

具體來說,我有一個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 

我還試圖用virtual void在JFoo而不是有一個抽象的C++類,但是,這並不工作,因爲你「不能聲明字段‘foo123’是抽象類型「。

如何爲Java接口創建JNI?

+0

要聲明JNI方法,Java有一個特殊的'native'關鍵字 –

+1

有喲你考慮過查閱文件嗎?而不是隻是猜測? – EJP

+0

我知道'native'關鍵字,並且正在使用它(只是沒有在我的問題中包含完整的代碼),謝謝! 你能幫我指點一下正確的文檔嗎?我已經做了大量的搜索,但是如果JNI代表Java Native Interface,那麼專門創建一個Java接口的JNI是很困難的。 :(我成功創建了一個Java類的JNI,但你說得對,我只是猜測一個接口而不是一個類。 – yoloswag

回答

0

好了,這是行不通的那樣:(

你不能再這樣下去。JNI可調用本地方法和操作通過在JNI實現所提供的功能的Java對象,但它沒有任何關係。有一個做一個映射

看看這裏:http://jnicookbook.owsiak.org/recipe-no-027/

此示例演示如何調用類的方法從C++

1

JNI用於實現實例(不包括static)或類(static)的方法。即使類包含其他抽象方法,方法實現也意味着具體的方法。一個接口的方法是完全抽象的。

語言文檔表明nativeclass declaration中方法的允許修飾符,但不適用於interface declaration。編譯器也會告訴你哪裏不能放native