2013-04-10 74 views
3

我在Java代碼,如下所示:定義/從C實例化一個Java對象/ C++

class MyClass 
{ 
public void MyFunc(ISomeListener listener); 
} 

我想調用從C++程序這種方法,並傳遞給它的所需的參數。請注意,該參數是一個接口的實現。因此我需要定義AND創建來自C++的java對象並將它傳遞給該方法。我怎樣才能做到這一點?

P.S. 如果有幫助,最初的問題是,java程序是一個硬件接口(如驅動程序)。我試圖從這個Java代碼創建一個DLL,以便它可以用於任何語言。所以我認爲我會使用C/C++打包代碼,然後將DLL做出來。

+1

在我看來,這種方法存在根本上的缺陷。除非通過jni使用某些本機庫,否則Java不能有任何低級的硬件接口。實現這一目標的真正常用方法是用java包裝本地對應部分,而不是周圍的其他方式。你要360º才能回到起點。我不知道確切的問題,但看起來很奇怪。 – 2013-04-10 11:53:48

+0

[你可以使用JNI從C++調用Java](http://stackoverflow.com/questions/819536/how-to-call-java-function-from-c)。我是否正確理解你想要在C++中實現Java接口,然後調用Java函數並將C++實現傳遞給它?我想知道這是否可能。特別是考慮到C++甚至沒有接口。 – Philipp 2013-04-10 11:55:16

+0

@ Yn5an3,你說得對。但是應用程序已經實施,重新實施它並不划算。 – atoMerz 2013-04-10 11:56:10

回答

0

我設法通過在java中定義Listener類來解決問題。偵聽器具有所需回調簽名的本地方法。

public class MyImpl implements MyInterface 
{ 
    @override 
    public native int callback(int i); 
} 

使用javac進行編譯。然後使用javah生成函數聲明以與JNI一起使用。在C程序中,我定義了該函數並使用RegisterNatives將impl類和已註冊的回調加載到該程序中。

P.S.如何使用JNI實際定義一個類仍然沒有答案。

編輯:
使用此方法有一個缺點。我將不得不在類對象範圍內的類作用域中註冊回調。

+1

如果你想在運行時定義類,那麼你可以使用[JavaCompiler類](http://www.accordess.com/wpblog/an-overview-of-java-compilation-api-jsr-199/ )。通過JNI調用它是微不足道的;它只需要一些代碼。你最好先定義你需要的所有類,然後加載它們的jar,而不是動態構建它們。 – Petesh 2013-04-13 13:22:36