从Java调用Objective-C代码的最简单方法是什么?

时间:2013-06-27 09:08:33

标签: java objective-c macos jnaerator corewlan

我需要从Java代码访问Mac OSX上的Wifi设备列表,在研究完之后,我发现我需要求助于“本机”代码 - 即CoreWLAN框架和CWInterface.h类({ {3}})

我最初认为我可以使用JNA调用此代码,但意识到我需要一些东西,因为CoreWLAN是Objective-C(不是C / C ++)。

我已经尝试过这个Objective-C Java桥接器(https://developer.apple.com/library/mac/#documentation/CoreWLAN/Reference/CWInterface_reference/translated_content/CWInterface.html)但我无法弄清楚如何让它找到CoreWLAN框架。

所以我也尝试过使用JNAerator(https://github.com/shannah/Java-Objective-C-Bridge),所以我可以使用BridJ(https://code.google.com/p/jnaerator/wiki/ObjectiveC),但我无法生成正确的Java代码。

  • 只使用此样式java -Xmx1000m -jar jnaerator.jar -framework CoreWLAN -jar CoreWlan.jar可以快速运行,但会生成一个只包含CoreWlan.h映射的jar
  • 如果我对CWInterface.h运行jnaerator,则jnaerator失败。 (我正在使用jnaerator的最新快照版本)

从Java调用CWInterface.h上的方法的最佳方法是什么?

3 个答案:

答案 0 :(得分:1)

我要做的是创建一个通过JNI与Jav​​a代码通信的C ++类。您可以在xCode项目中同时使用C ++和Obj-C。我没有尝试过使用带有JNI的Obj-C ++类,但我只想创建一个C ++类,负责Java和Obj-C之间的所有通信,这个类可以只包含在你需要的Obj-C类中它(将此Obj-C文件的扩展名更改为.mm,因为它将包含C ++代码)。

我发现这是一篇关于JNI的有用文章:http://www.ibm.com/developerworks/java/tutorials/j-jni/

答案 1 :(得分:1)

我个人会通过两个完全独立的程序来实现这一点,这些程序通过共享内存映射文件进行通信。一个程序用直接的Objective-C编写,另一个用直接的Java编写。

内存映射意味着两个程序都可以访问相同的内存区域,而不必依赖JNI。

关于Java内存映射的注释:

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

关于目标C的内存映射的注释:

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

那就是说,如果你想做JNI路线,那么Apple有以下建议:

  

建议您使用Xcode中的Java JNI模板作为JNI开发的起点。

     

要与JNI中的Objective-C运行时互操作,请链接JavaNativeFoundation.framework,   是JavaVM.framework的子框架。它包含自动设置的Objective-C类和宏   并拆除自动释放池,捕获并重新抛出Java和Cocoa异常,保存JNI全局引用   在Foundation容器类中,并转换字符串,数字,列表,映射和集的对象图。

以上引述来自这里:

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

答案 2 :(得分:1)

您可以使用java objective-c桥接器。您只需要使用jna的Native.loadLibrary()方法加载要使用的框架。

此示例使用WebKit框架。 https://github.com/shannah/Java-Objective-C-Bridge/blob/master/java/test/ca/weblite/objc/TestWebView.java