2013-06-27 38 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

相关问题