在 NativeUI C++ 基础架构中如何解析实际的原生 UI 小部件?
Posted
技术标签:
【中文标题】在 NativeUI C++ 基础架构中如何解析实际的原生 UI 小部件?【英文标题】:How are actual native UI widget resolved within the NativeUI C++ infrastructure? 【发布时间】:2014-01-27 18:02:31 【问题描述】:当在 MoSync 代码库中使用 NativeUI C++ 类时,我想知道并理解最终调用实际 ios/android/WP 原生小部件的代码。
我快速浏览了 GitHub 上的一些类,例如 Button.cpp 等,但我看不出真正的原生设备小部件是如何被引用的。
我不是 C/C++ 开发人员 (Java),但我有点期待一些 #ifdefs 或其他东西来“切换”出相应的底层实现。如果不是这样,那我也没关系,请放纵我的好奇心。
【问题讨论】:
【参考方案1】:像 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#等):
在MoSyncNativeUI.java中可以使用Java Native Interface (JNI)调用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 调用。
【讨论】:
以上是关于在 NativeUI C++ 基础架构中如何解析实际的原生 UI 小部件?的主要内容,如果未能解决你的问题,请参考以下文章