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

3
我需要从Java代码访问Mac OSX上的Wifi设备列表。经过研究,我发现我需要使用“本地”代码 - 即CoreWLAN框架和CWInterface.h类(https://developer.apple.com/library/mac/#documentation/CoreWLAN/Reference/CWInterface_reference/translated_content/CWInterface.html)。 起初,我认为我可以使用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的映射。
  • 如果我对CWInterface.h运行jnaerator,则jnaerator会失败。 (我正在使用jnaerator的最新快照版本)

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


尝试使用Rococoa。 - shreyansh jogi
3个回答

1

个人而言,我会通过两个完全独立的程序进行此操作,这两个程序通过共享内存映射文件进行通信。一个程序采用纯Objective-C编写,另一个程序采用纯Java编写。

内存映射意味着两个程序都可以访问相同的内存区域,而无需使用JNI。

关于从Java进行内存映射的注意事项:

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

关于Objective C中的内存映射的注释:

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

如果您想使用JNI路线,那么苹果公司建议您使用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


1

1
我会创建一个C++类,通过JNI与Java代码通信。您可以在xCode项目中使用C++和Obj-C。我自己没有尝试过使用Obj-C++类与JNI,但我会创建一个C++类来负责Java和Obj-C之间的所有通信,这个类可以包含在需要它的Obj-C类中(将此Obj-C文件的扩展名更改为.mm,因为它将包含C++代码)。
我发现这篇关于JNI的文章很有帮助:http://www.ibm.com/developerworks/java/tutorials/j-jni/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接