2017-05-02 70 views
0

我想使用JNA調用DLL函數,但該庫使用非標準C類型。帶有JNA的非標準類型

我可以在wikipedia中看到什麼是mapping between C and Java standard types但是,自定義類型發生了什麼?

+1

這就好比說「我想購買飛行烤麪包機。我已經看過的所有的商店,並有大量烤麪包機,但什麼是與飛行烤麪包機發生?」那麼,***沒有人出售。***你期望什麼? –

+1

小心提供任何這些有問題的自定義類型?如果你不明白C中的類型是如何定義的,那麼值得複習。 – technomage

回答

0

你可以在C/C++中編寫一個包裝器。該包裝器包含定義自定義類型的標題。新的包裝函數應該只接受標準類型作爲輸入,並在調用庫函數之前將「翻譯」爲自定義類型,與返回值也可以進行翻譯的方式相同。現在通過JNA從Java調用你的包裝函數。

否則,您可以隨時查看SWIG和JNI。

+0

謝謝@visibleman。我認爲JNA比JNI更好,對嗎? – Amparo

+1

@ JNA項目頁面的@Amparo(https://github.com/java-native-access/jna):「_JNA使用一個小的JNI庫存根來動態地調用本地代碼。開發者使用Java接口來描述函數以及目標本地庫中的結構,這使得利用本地平臺特性**非常容易,而不會導致爲多個平臺配置和構建JNI代碼的高昂開銷** _「 – cubrr

0

將Java類映射到體系結構依賴類型是精簡版 JNI庫的目的。將它看作只是一個接口庫,將傳遞給JNI調用的類和類型映射到C或C++程序的類型和類中,因此需要考慮非標準問題。例如,認爲與linux/gcc的接口應該與連接到Windows/VisualStudio有所不同。無論如何,甲骨文公司(前Sun Microsystems公司)的員工已經做了一項很好的工作,試圖隱藏大多數依賴於架構的代碼並儘可能標準化。

我對他們的感激之情從這裏:)