2013-06-27 85 views
3

我需要從Java代碼訪問Mac OSX上的Wifi設備列表,並且在研究它之後,我發現我需要使用「本機」代碼 - 即CoreWLAN框架和CWInterface.h類(https://developer.apple.com/library/mac/#documentation/CoreWLAN/Reference/CWInterface_reference/translated_content/CWInterface.html從Java調用Objective-C代碼的最簡單方法是什麼?

我最初認爲我可以使用JNA調用此代碼,但意識到自CoreWLAN是Objective-C(而不是C/C++)以來,我需要一些東西。

我試過這個Objective-C的Java橋(https://github.com/shannah/Java-Objective-C-Bridge),但我無法弄清楚如何使它找到CoreWLAN框架。

所以我也試過使用JNAerator(https://code.google.com/p/jnaerator/wiki/ObjectiveC),所以我可以使用BridJ(https://code.google.com/p/bridj/),但我不能讓它生成正確的Java代碼。

  • 就使用這種風格迅速java -Xmx1000m -jar jnaerator.jar -framework CoreWLAN -jar CoreWlan.jar運行,但結果只包含CoreWlan.h
  • 映射如果我跑jnaerator對CWInterface.h一個罐子,然後jnaerator失敗。 (我正在使用jnaerator的最新快照版本)

從Java調用CWInterface.h方法的最佳方法是什麼?

+0

rococoa嘗試使用 –

回答

1

我會做的是創建一個C++類,通過JNI與Jav​​a代碼進行通信。您可以在xCode項目中同時使用C++和Obj-C。我還沒有試圖用JNI使用Obj-C++類,但我只是創建一個負責Java和Obj-C之間所有通信的C++類,這個類可以包含在Obj-C類中,而您需要它(將該Obj-C文件的擴展名更改爲.mm,因爲它將包含C++代碼)。

我這個發現JNI一個有用的文章:http://www.ibm.com/developerworks/java/tutorials/j-jni/

0

個人而言,我會通過通過共享內存映射文件進行通信的兩個完全獨立的程序做到這一點。一個程序用直接Objective-C編寫,另一個用直接Java編寫。

內存映射意味着這兩個程序都可以訪問相同的內存區域,而不必訴諸於JNI。

https://gist.github.com/jverkoey/2985830 

也就是說,如果你想幹什麼去了JNI路線,那麼蘋果有:

http://javarevisited.blogspot.co.uk/2012/01/memorymapped-file-and-io-in-java.html 

從Objective C的內存映射注:從Java的內存映射

注意事項以下建議:

建議您使用Xcode中的Java JNI模板作爲JNI開發的起點換貨。

爲了與來自JNI的Objective-C運行時互操作,鏈接到JavaNativeFoundation.framework,其中 是JavaVM.framework的子框架。它包含Objective-C類和宏,以自動設置 並拆除自動釋放池,捕獲並重新拋出Java和Cocoa異常,在Foundation容器類中保存JNI全局引用 ,並將字符串,數字,列表,地圖和集合。

以上報價均從這裏取:

https://developer.apple.com/library/mac/documentation/java/conceptual/java14development/Java14Development.pdf

相關問題