在 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 小部件?的主要内容,如果未能解决你的问题,请参考以下文章

腾讯课堂 C++微服务架构及安全云盘项目实训 百度云

优质版Mysql性能调优|索引原理|架构搭建|问题解析实操

好课分享:易道云 C语言C++零基础到大神全栈课程(逆向游戏开发架构反外挂) 百度云

关于课程设计实训体会

C++ template技巧性基础知识总结

c++基础(lambda)