当在 MoSync 代码库中使用 NativeUI C++ 类时,我想知道并理解最终调用实际 IOS/Android/WP 原生小部件的代码。
我快速浏览了 GitHub 上的一些类,例如Button.cpp等,但我无法轻易看到真正的原生设备小部件是如何被引用的。
我不是 C/C++ 开发人员(Java),但我有点期待一些 #ifdefs 或其他东西来“切换”相应的底层实现。如果不是这样,那我没关系,请放纵我的好奇心。
像提到的Button.cpp这样的 C++ Widget 类在Widget.cpp中有它们的基类,它基于字符串参数创建任何小部件。此外,任何小部件属性都是通过字符串参数有效设置的。
my_button = new NativeUI::Widget("button")
my_button->setProperty("text", "OK");
MoSync 在WidgetFunctions.idl中为 Native UI 小部件实现了一个“IDL”接口:
typedef int MAWidgetHandle;
MAWidgetHandle maWidgetCreate(in MAString widgetType);
int maWidgetSetProperty(in MAWidgetHandle widget, in MAString property, in MAString value);
这是通过 C 调用接口从NativeUI::Widget调用的函数的与语言无关的描述:
handle = maWidgetCreate("button");
maWidgetSetProperty(handle,"text","OK");
在此之前,我们处于 MoSync C/C++ 层,这是一种具有系统调用接口的 VM。从这里它通过不同的方法被翻译成其他平台的语言(Java、C#等):
它可以使用 Java Native Interface (JNI) 在MoSyncNativeUI.java中调用 Android 运行时中的相应函数:
public int maWidgetCreate(String type)
public int maWidgetSetProperty(int widgetHandle, String key, String value)
或者它被编译成中间的“PIPE 语言”,一种伪汇编语言,然后这种语言被翻译成适用于 Windows Phone 7 的 Visual Studio C#,或者翻译成适用于 iOS 的 XCode 项目。
所有平台都在“运行时”中实现了一个 UI 引擎,该引擎与每个应用程序包捆绑在一起。此运行时预构建在相应的 SDK 中并实现那些 Native UI 调用。