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即可快速运行,但生成的 jar 仅包含 CoreWlan.h 的映射
  • 如果我对 CWInterface.h 运行 jnaerator,那么 jnaerator 会失败。(我正在使用 jnaerator 的最新快照版本)

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

4

3 回答 3

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

于 2014-02-23T01:31:18.550 回答
1

我要做的是创建一个通过 JNI 与 Java 代码通信的 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/

于 2013-06-27T10:31:18.253 回答
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 路线,那么 Apple 有以下建议:

建议您使用 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

于 2014-02-22T12:34:43.193 回答