Maemo Linux手机平台系列分析:11 Maemo平台开发之 异步GConf

Maemo Linux手机平台系列分析:6 Maemo平台开发之D-Bus     在Maemo平台中,D-Bus是一个非常重要的中间件(middleware)解决方案,主要用于进程之间的通信。已经有很多服务使用了D-Bus,接下来将介绍不同的方法去实现。D-Bus是贯穿于Maemo平台的,离不开D-Bus。  这部分的内容: 介绍一下D-Bus D-Bus的架构 D-Bus的地址和名字 在Maemo中D-Bus的作用 阅读详情
 
 
异步GConf
  • 用GConf来监视变化
  • 当监视对象发生变化时,用GConf给通知
 
用GConf来监视对象的改变
在Maemo中,GConf是主要的用于存储一些设置参数的底层软件。下面,我们将会看到如何去扩展GConf,使它能够更适合于异步方式工作,特别是实现一些服务时,如果把握GConf的使用。
 
这些情况下需要使用GConf: 1 你的服务程序有些比较简单的参数设置,并且需要能够实时地对参数的变化进行响应;2 人们也想偷懒,不想自己写一个配置文件解析程序(尽管Glib已经自带了一个这样的解析程序);我们的例子程序就是模仿第一种情况。
 
例子程序主要关注两个字符串:一个是设置设备的通信(connection), 另外一个是设置通信参数(connectionparams)。这里我们主要关心gconf值变化的通知,这里会省略一些简单的东西,所以你需要预先给那两个值设置初始值。用gconftool-2来设置。写到makefile中:
# Define a variable for this so that the GConf root may be changed
gconf_root := /apps/Maemo/platdev_ex
 
# ... Listing cut for brevity ...
 
# This will setup the keys into default values.
# It will first do a clear to remove any existing keys.
primekeys: clearkeys
      gconftool-2 --set --type string /
                  $(gconf_root)/connection btcomm0
      gconftool-2 --set --type string /
                  $(gconf_root)/connectionparams 9600,8,N,1
 
# Remove all application keys
clearkeys:
      @gconftool-2 --recursive-unset $(gconf_root)
 
# Dump all application keys
dumpkeys:
      @echo Keys under $(gconf_root):
      @gconftool-2 --recursive-list $(gconf_root)
运行两个命令设置主键,并且查看是否设置OK:
[sbox-CHINOOK_X86: ~/gconf-listener] > make primekeys
gconftool-2 --set --type string /
            /apps/Maemo/platdev_ex/connection btcomm0
gconftool-2 --set --type string /
            /apps/Maemo/platdev_ex/connectionparams 9600,8,N,1
[sbox-CHINOOK_X86: ~/gconf-listener] > make dumpkeys
Keys under /apps/Maemo/platdev_ex:
 connectionparams = 9600,8,N,1
 connection = btcomm0
 
当监视对象发生变化时,用GConf给通知
定义一个根健和两个主键,即所谓的名字空间(name space):
#include <glib.h>
#include <gconf/gconf-client.h>
#include <string.h> /* strcmp */
 
/* As per maemo Coding Style and Guidelines document, we use the
   /apps/Maemo/ -prefix.
   NOTE: There is no central registry (as of this moment) that you
         could check that your application name doesn't collide with
         other application names, so caution is advised! */
#define SERVICE_GCONF_ROOT "/apps/Maemo/platdev_ex"
 
/* We define the names of the keys symbolically so that we may change
   them later if necessary, and so that the GConf "root directory" for
   our application will be automatically prefixed to the paths. */
#define SERVICE_KEY_CONNECTION /
        SERVICE_GCONF_ROOT "/connection"
#define SERVICE_KEY_CONNECTIONPARAMS /
        SERVICE_GCONF_ROOT "/connectionparams"
主函数创建一个GConf client对象(就是通过这个对象链接到Gconf 后台daemon程序的),然后显示前面设置的值:
int main (int argc, char** argv) {
 /* Will hold reference to the GConfClient object. */
 GConfClient* client = NULL;
 /* Initialize this to NULL so that we'll know whether an error
     occurred or not (and we don't have an existing GError object
     anyway at this point). */
 GError* error = NULL;
 /* This will hold a reference to the mainloop object. */
 GMainLoop* mainloop = NULL;
 
 g_print(PROGNAME ":main Starting./n");
 
 /* Must be called to initialize GType system. The API reference for
     gconf_client_get_default() insists.
     NOTE: Using gconf_init() is deprecated! */
//已经废弃gconf_init()
 g_type_init();
 
 /* Create a new mainloop structure that we'll use. Use default
     context (NULL) and set the 'running' flag to FALSE. */
 mainloop = g_main_loop_new(NULL, FALSE);
 if (mainloop == NULL) {
    g_error(PROGNAME ": Failed to create mainloop!/n");
 }
 
 /* Create a new GConfClient object using the default settings. */
 client = gconf_client_get_default();
 if (client == NULL) {
    g_error(PROGNAME ": Failed to create GConfClient!/n");
 }
 
 g_print(PROGNAME ":main GType and GConfClient initialized./n");
 
 /* Display the starting values for the two keys. */
 dispStringKey(client, SERVICE_KEY_CONNECTION);
 dispStringKey(client, SERVICE_KEY_CONNECTIONPARAMS);
函数dispStringKey非常简单,主要是提取和显示一个字符串:
/**
 * Utility to retrieve a string key and display it.
 * (Just as a small refresher on the API.)
 */
static void dispStringKey(GConfClient* client,
                          const gchar* keyname) {
 
 /* This will hold the string value of the key. It will be
     dynamically allocated for us, so we need to release it ourselves
     when done (before returning). */
 gchar* valueStr = NULL;
 
 /* We're not interested in the errors themselves (the last
     parameter), but the function will return NULL if there is one,
     so we just end in that case. */
 valueStr = gconf_client_get_string(client, keyname, NULL);
 
 if (valueStr == NULL) {
    g_error(PROGNAME ": No string value for %s. Quitting/n", keyname);
    /* Application terminates. */
 }
 
 g_print(PROGNAME ": Value for key '%s' is set to '%s'/n",
          keyname, valueStr);
 
 /* Normally one would want to use the value for something beyond
     just displaying it, but since this code doesn't, we release the
    allocated value string. */
 g_free(valueStr);
}
下面我们吧GConf client绑定到特定的路径(我们将操作它,并监视它的改变):
 /**
   * 把要监视的路径注册给GConf client, 当这个路径中的内容发生改变时,会发射信号“value-changed”出来,
   * Register directory to watch for changes. This will then tell
   * GConf to watch for changes in this namespace, and cause the
   * "value-changed"-signal to be emitted. We won't be using that
   * mechanism, but will opt to a more modern (and potentially more
   * scalable solution). The directory needs to be added to the
   * watch list in either case.
   *
   * GConfClient可以预加载一些键值,
  * When adding directories, you can sometimes optimize your program
   * performance by asking GConfClient to preload some (or all) keys
   * under a specific directory. This is done via the preload_type
   * parameter (we use GCONF_CLIENT_PRELOAD_NONE below). Since our
   * program will only listen for changes, we don't want to use extra
   * memory to keep the keys cached.
   *
   * Parameters:
   * - client: GConf-client object
   * - SERVICEPATH: the name of the GConf namespace to follow
   * - GCONF_CLIENT_PRELOAD_NONE: do not preload any of contents
   * - error: where to store the pointer to allocated GError on
   *          errors.
   */
 gconf_client_add_dir(client,
                       SERVICE_GCONF_ROOT,//要监听的路径
                       GCONF_CLIENT_PRELOAD_NONE,
                       &error);
 
 if (error != NULL) {
    g_error(PROGNAME ": Failed to add a watch to GCClient: %s/n",
            error->message);
    /* Normally we'd also release the allocated GError, but since
       this program will terminate on g_error, we won't do that.
       Hence the next line is commented. */
    /* g_error_free(error); */
 
    /* When you want to release the error if it has been allocated,
       or just continue if not, use g_clear_error(&error); */
 }
 
  g_print(PROGNAME ":main Added " SERVICE_GCONF_ROOT "./n");
接下来,我们需要注册回调函数,这个回调函数在监视对象发生改变时,被调用:
 /* Register our interest (in the form of a callback function) for
     any changes under the namespace that we just added.
 
     Parameters:
     - client: GConfClient object.
     - SERVICEPATH: namespace under which we can get notified for
                    changes.
     - gconf_notify_func: callback that will be called on changes.
     - NULL: user-data pointer (not used here).
     - NULL: function to call on user-data when notify is removed or
             GConfClient destroyed. NULL for none (since we don't
             have user-data anyway).
     - error: return location for an allocated GError.
 
     Returns:
     guint: an ID for this notification so that we could remove it
            later with gconf_client_notify_remove(). We're not going
            to use it so we don't store it anywhere. */
 gconf_client_notify_add(client, SERVICE_GCONF_ROOT,
                          keyChangeCallback, NULL, NULL, &error);
 if (error != NULL) {
    g_error(PROGNAME ": Failed to add register the callback: %s/n",
            error->message);
    /* Program terminates. */
 }
 
 g_print(PROGNAME ":main CB registered & starting main loop/n");
当我们处理桌面软件时,你可能使用多个回调函数,每个回调去跟踪一个键值。其实这样做不好,我们可以使用一个回调处理多个键值的跟踪:
/**
 * 当监视路径发生改变时,会调用回调函数,并且这个回调函数要和GConfClientNotifyFunc原型一致;
 * Callback called when a key in watched directory changes.
 * Prototype for the callback must be compatible with
 * GConfClientNotifyFunc (for ref).
 *
 * It will find out which key changed (using strcmp, since the same
 * callback is used to track both keys) and the display the new value
 * of the key.
 *
 * 通常情况下,userData会把改变的值携带给回调函数,这样我们才能根据改变的值修改界面,不过这里仅仅是个示例,就不这样搞了。
 * The changed key/value pair will be communicated in the entry
 * parameter. userData will be NULL (can be set on notify_add [in
 * main]). Normally the application state would be carried within the
 * userData parameter, so that this callback could then modify the
 * view based on the change. Since this program does not have a state,
 * there is little that we can do within the function (it will abort
 * the program on errors though).
 */
static void keyChangeCallback(GConfClient* client,
                              guint        cnxn_id,
                              GConfEntry* entry,
                              gpointer     userData) {
 
 /* This will hold the pointer to the value. */
 const GConfValue* value = NULL;
 /* This will hold a pointer to the name of the key that changed. */
 const gchar* keyname = NULL;
 /* This will hold a dynamically allocated human-readable
     representation of the changed value. */
 gchar* strValue = NULL;
 
 g_print(PROGNAME ": keyChangeCallback invoked./n");
 
 /* Get a pointer to the key (this is not a copy). */
 keyname = gconf_entry_get_key(entry);
 
 /* It will be quite fatal if after change we cannot retrieve even
     the name for the gconf entry, so we error out here. */
 if (keyname == NULL) {
    g_error(PROGNAME ": Couldn't get the key name!/n");
    /* Application terminates. */
 }
 
 /* Get a pointer to the value from changed entry. */
 value = gconf_entry_get_value(entry);
 
 /* If we get a NULL as the value, it means that the value either has
     not been set, or is at default. As a precaution we assume that
     this cannot ever happen, and will abort if it does.
     NOTE: A real program should be more resilient in this case, but
           the problem is: what is the correct action in this case?
           This is not always simple to decide.
     NOTE: You can trip this assert with 'make primekeys', since that
           will first remove all the keys (which causes the CB to
           be invoked, and abort here). */
 g_assert(value != NULL);
 
 /* Check that it looks like a valid type for the value. */
 if (!GCONF_VALUE_TYPE_VALID(value->type)) {
    g_error(PROGNAME ": Invalid type for gconfvalue!/n");
 }
 
 /* Create a human readable representation of the value. Since this
     will be a new string created just for us, we'll need to be
     careful and free it later. */
 strValue = gconf_value_to_string(value);
 
 /* Print out a message (depending on which of the tracked keys
     change. */
 if (strcmp(keyname, SERVICE_KEY_CONNECTION) == 0) {
    g_print(PROGNAME ": Connection type setting changed: [%s]/n",
            strValue);
 } else if (strcmp(keyname, SERVICE_KEY_CONNECTIONPARAMS) == 0) {
    g_print(PROGNAME ": Connection params setting changed: [%s]/n",
            strValue);
 } else {
    g_print(PROGNAME ":Unknown key: %s (value: [%s])/n", keyname,
            strValue);
 }
 
 /* Free the string representation of the value. */
 g_free(strValue);
 
 g_print(PROGNAME ": keyChangeCallback done./n");
}
上面的代码有点复杂,原因是GConf使用GValue作为变量来传递数据:GValue可以携带任何简单的数据类型。由于我们不能完全相信GConf会返回正确的值,我们需要格外小心:对返回值的类型做仔细的检查,防止NULL引起的程序异常和其它类型不匹配错误。
 
好了,下面我们编译并测试该程序:在后台启动这个程序,然后使用gconftool-2修改键值,看看监视函数能不能对键值的改变做出及时的响应:
[sbox-CHINOOK_X86: ~/gconf-listener] > make
cc -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/gconf/2 /
   -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -Wall -g /
   -DPROGNAME=/"gconf-key-watch/" gconf-key-watch.c -o gconf-key-watch /
   -lgconf-2 -ldbus-glib-1 -ldbus-1 -lgobject-2.0 -lglib-2.0
[sbox-CHINOOK_X86: ~/gconf-listener] > run-standalone.sh ./gconf-key-watch & //后台运行
[2] 21385
gconf-key-watch:main Starting.
gconf-key-watch:main GType and GConfClient initialized.
gconf-key-watch: Value for key '/apps/Maemo/platdev_ex/connection'
 is set to 'btcomm0'
gconf-key-watch: Value for key '/apps/Maemo/platdev_ex/connectionparams'
 is set to '9600,8,N,1'
gconf-key-watch:main Added /apps/Maemo/platdev_ex.
gconf-key-watch:main CB registered & starting main loop
[sbox-CHINOOK_X86: ~/gconf-listener] > gconftool-2 --set --type string / //修改键值
 /apps/Maemo/platdev_ex/connection ttyS0
gconf-key-watch: keyChangeCallback invoked.
gconf-key-watch: Connection type setting changed: [ttyS0] //监视函数及时检测到键值的修改
gconf-key-watch: keyChangeCallback done.
[sbox-CHINOOK_X86: ~/gconf-listener] > gconftool-2 --set --type string / //修改键值
 /apps/Maemo/platdev_ex/connectionparams ''
gconf-key-watch: keyChangeCallback invoked.
gconf-key-watch: Connection params setting changed: [] //监视函数及时检测到键值的修改
gconf-key-watch: keyChangeCallback done.
後一个修改是有问题的:修改成空值了。由于GConf本身并不提供语法和语义的检查,因此,对于修改键值的检查也是你需要仔细考虑的。
 
当发现键值被修改为非法键值时,你可以把该键值复位为初始值。不过,这种复位操作可能会影响到其它关联的程序,比较冒险,一般不这样做。另外:由于特定的环境没有办法告诉用户你的程序已经退出,所以当遇到非法键值时,程序退出也不是一个好的办法。
 
另外一个问题:一个动作可能影响到多个键值。你需要处理这个问题。上面的例子也可以验证这个问题:当connection-key键值改变时,server应该重新初始化这个connection吗?或者如果键值”同时”改变了,则connection会被重新初始化两次的。这是很严重的问题。Gconf并不支持原子操作。这是实际工作中必须面对的问题。
 
下面我们再测试一些异常的问题:
[sbox-CHINOOK_X86: ~/gconf-listener] > gconftool-2 --set --type int /
 /apps/Maemo/platdev_ex/connectionparams 5 //设置的类型不对,不是字符串
gconf-key-watch: keyChangeCallback invoked.
gconf-key-watch: Connection params setting changed: [5]
gconf-key-watch: keyChangeCallback done.
[sbox-CHINOOK_X86: ~/gconf-listener] > gconftool-2 --set --type boolean /
 /apps/Maemo/platdev_ex/connectionparams true
gconf-key-watch: keyChangeCallback invoked.
gconf-key-watch: Connection params setting changed: [true]
gconf-key-watch: keyChangeCallback done.
对于前面设置为空的键值,清除时发生了崩溃!
[sbox-CHINOOK_X86: ~/gconf-listener] > make clearkeys
gconf-key-watch: keyChangeCallback invoked.
gconf-key-watch[21403]: GLIB ERROR ** default -
 file gconf-key-watch.c: line 129 (keyChangeCallback):
 assertion failed: (value != NULL)
aborting...
/usr/bin/run-standalone.sh: line 11: 21403 Aborted (core dumped) "$@"
[1]+ Exit 134 run-standalone.sh ./gconf-key-watch
在回调函数里面,我们检查了非NULL值,对于NULL的值,我们退出程序,所以上面的异常在我们的意料之内。
 
 
保姆级教程:在阿里云ECS上用Docker一键部署EMQX MQTT服务器(Ubuntu 20.04) 本文提供在阿里云ECS上使用Docker一键部署EMQX MQTT服务器的详细教程,涵盖从实例创建、Docker环境配置到EMQX部署与优化的全流程。适合物联网开发者快速搭建高效、安全的MQTT消息服务器,适用于智能家居、工业物联网等场景。 阅读详情

相关推荐

代码审计工具学习之RISP(安装以及初步操作)

1 代码审计 1.1名词解释 代码审计(Code audit)是一种以发现程序错误,安全漏洞和违反程序规范为目标的源代码分析。软件代码审计是对编程项目中源代码的全面分析,旨在发现错误,安全漏洞或违反编程约定。 它是防御性编程范例的一个组成部分,它试图在软件发布之前减少错误。 C和C ++源代码是最常见的审计代码,因为许多高级语言(如Python)具有较少的潜在易受攻击的功能(例如,不检查边界的函数)。 顾名思义就是检查源代码中的安全缺陷,检查程序源代码是否存在安全隐患,或者有编码不规范的地方,通过..

weixin_52515588的博客 1万+

maemo sdk 搭建(官方转载)

http://wiki.maemo.org/Maemo_5_Final_SDK_%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97Maemo 5 Final SDK 安装指南Contents [hide]1 介绍1.1 Maemo SDK没有包含的内容2 通过图形界面的安装程序安装Maemo 5 SD

liucheng2009的专栏 1709

RedVQA:轻量级无参考视频质量评估算法原理与工程实践

视频质量评估是计算机视觉领域的关键技术,旨在通过算法自动量化视频的观看体验。其核心原理在于模拟人眼视觉系统,从像素数据中提取并融合空域和时域特征,以预测主观质量分数。这项技术的价值在于,它能自动化处理海量视频内容的质量监控,为流媒体服务、移动设备影像优化等场景提供关键指标。无参考视频质量评估作为该领域的前沿方向,无需原始无损视频作为参考,更贴合实际应用。本文以RedVQA项目为例,深入剖析了如何利用轻量化的深度网络架构,如MobileNetV3,结合高效的时空特征融合模块,在保证评估精度的同时,大幅降低计算

weixin_28698129的博客 575

Maemo Linux手机平台分析系列:3 安装Maemo平台宿主Linux系统

 我们大多数单个主机都用的是Windows, 如果为了研究Maemo,还要把Windows的某个分区格式化,然后安装Linux,好像动静大了点。而且我们看文档一般习惯于在windows下面。用vmware可以解决这问题:在windows上安装vmware, 然后在vmware中安装Linux. 这样就不必离开windows了,而且可以在windows和Linux之前方便的切换。

Linux智能手机--cuijpus的专栏 6410

热力学仿真软件:Fluent_(8).材料属性设置

在 Fluent 中,材料属性主要包括密度、比热容、导热系数、黏度等物理性质。这些属性在不同的仿真场景中有着不同的作用,例如在流体仿真中,密度和黏度是必不可少的;在传热仿真中,导热系数和比热容是主要考虑的因素。如果所需的材料不在材料库中,或者需要对现有材料进行修改,用户可以自定义材料属性。在主菜单中选择Materials。点击打开材料编辑器。在材料编辑器中,点击Create按钮,输入新的材料名称。选择材料类型(如FluidSolid等)。在属性栏中填写所需的材料属性。

kkchenjj的博客 1492

STM32 W5500 Freemodbus Modbus TCP协议功能实现

STM32F103VCT6 W5500(SPI1),实现Modbus-TCP协议的功能

坚韧与专注 2万+

Maemo Linux手机平台系列分析:(17) Maemo应用开发: GNU make 与makefile

 这部分的内容: 什么是GNU make Make是如何工作的 一个简单的例子 解剖makefile ·         默认目标 关于makefile的几种名字 问题 增加make的目标 一次Make一个目标 伪关键字 指定默认目标 其它的通用伪目

Linux智能手机--cuijpus的专栏 1449

基于ESP32的智能无线广播系统开发博客

通过本项目的开发,我们成功地实现了基于ESP32的智能无线广播系统。该系统不仅具备传统广播的功能,还实现了通过Wi-Fi无线传输音频、实时广播和智能控制等多种先进功能。未来,随着技术的进一步发展,我们还可以扩展更多功能,如智能推荐广播内容、支持语音识别和控制等。希望本项目能够为嵌入式开发人员提供一些思路和参考,帮助大家在实际开发中更好地应用ESP32平台,开发出更加智能和实用的无线广播系统。

2201_76125393的博客 423

Maemo Linux手机平台系列分析:1 技术概览

QA: Q:为什么去分析Maemo平台呢?A:分析一个平台是为了掌握它,吸收有用的东西为我所用。 Q:为什么选择Maemo平台呢?A:Linux手机平台目前主要有ALP,Maemo, LiMo, Android, etc. (欢迎大家补充J)目前不少都是打着开源的旗号的,但是公开的力度不同:ALP目前仅仅公开了其Hilker部分;Maemo全部公开;Li

Linux智能手机--cuijpus的专栏 4233

CCF编程培训师资认证(PTA)标准(教学能力T)

随着计算机科学的不断发展,计算机相关技术应用到社会各个行业,越来越多的青少年参加到了计算机程序设计的学习中,这对编程培训教师提出了更高的专业要求和职业要求。CCF开展编程培训师资认证项目(Programming Trainer Accreditation,PTA),旨在建立一个规范的、科学的、权威且有公信力的三方认证。认证考试分编程专业能力(P)和教学能力(T)两部分。本标准根据《CCF编程培训师资认证条例》第十条制定,旨在明确教学能力(T)的测试标准。

lan_in的博客 1709

YOLO11改进|卷积篇|引入SPDConv

YOLO11中添加SPDConv卷积

A1983Z的博客 3696

Maemo Linux手机平台系列分析:5 安装Maemo SDK

   这部分的内容: 前言 什么是Scratchbox? Scratchbox的组成 安装的前提条件 自动安装Scratchbox 自动安装Maemo SDK  前言这部分主要介绍安装开发环境以及其先决条件。Maemo SDK含有开发应用的库和工具。这个SDK必须安装在一个称作Scratchbox的开

Linux智能手机--cuijpus的专栏 3587

Vue Print Designer——一款让打印模板的设计变简单的可视化打印设计器

Vue Print Designer——一款让打印模板的设计变简单的可视化打印设计器

bjzhang75的博客 684

在Ubuntu 9.10上搭建Maemo 5及Qt 4开发环境

 Maemo是Linux的一个嵌入式发行版,支持ARM构架,其开发环境自然是桌面Linux了。由于Maemo使用了Debian包管理系统,所以最好还是在Debian或者Ubuntu上搭建开发环境了(目前支持X86和ARM两个构架)。为了简化开发,推荐使用Scratchbox作为沙盒,该软件能够很好的虚拟Maemo环境以便于调试,并提供了很好的跨平台编译支持。如果你没有Linux环境

Xizhi Zhu的博客 3291

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

如何创建Maemo应用程序

http://wiki.forum.nokia.com/index.php?title=%E5%A6%82%E4%BD%95%E5%88%9B%E5%BB%BAMaemo%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F

QuietHeart的专栏 624

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Nokia Qt SDK开发环境使用

Nokia Qt SDK是诺基亚专门为跨平台手机开发Qt应用推出的开发工具,相比以往的SDK,它具有如下特点: 安装更简便:只需要下载一个安装包 模拟器启动更快: 利用Qt重新开发了轻量级的模拟器 真正跨平台:利用一个开发工具可以同时开发Symbian,maemo以及模拟器上的应用 支持硬件调试 开发平台可扩展:通过扩展,可以开发其它平台的应用,比如Windows,Mac等平台的应用 ...

weixin_34390996的博客 195

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

maemo hildon-desktop(1)

maemo hildon-desktop(1)2011-7-1 15:48:25maemo系统的桌面对应的二进制程序为hildon-desktop.launch这个可以理解成一个框架或者一个容器。他管理系统中所有的GUI程序如果某个GUI程序不在其管理下,某些

845

关于maemo Desktop/HomeUI自己收集的资料总结

1.How to write Hildon Desktop plugins for maemohttp://test.maemo.org/platform/docs/howtos/tutorial_desktop_plugins_bora.html#examples 2,Maemo Chinook 4.0.x Tutorialhttp://maemo.org/developme

QuietHeart的专栏 751

Development Environment of Maemo

You can find online document on:http://wiki.maemo.org/Documentation/Maemo_5_Final_SDK_Installation(1) At first you should install Xephyr :apt-get install xserver-xephyr(2) Installing Maemo 5 SDK:1

第三只眼的专栏 1011

maemo hildon-desktop(2)

maemo hildon-desktop(2)老版本的源码地址  http://repository.maemo.org/首先看一下 desktop 类型 struct _HDDesktopPrivate {  gchar                 *c

613

如何创建Maemo应用程序(转)

如何创建Maemo应用程序 From Forum Nokia Wiki 本文是一篇对Maemo.org开源社区官方文档How to Write New Applications in maemo 4.0的非正式简体中文翻译版本。希望本文对广大中国开发者了解Maemo平台以及开发Maemo平台应用程序带来一些帮助:) C...

weixin_34250434的博客 147

2025最强MaruOS开发指南:从环境搭建到系统构建的完整实践

Maru OS是一款创新的开源项目,让你的手机变身为强大的PC。本指南将带你从环境搭建到系统构建,全面掌握MaruOS开发的核心技能,轻松实现"手机即电脑"的终极体验。 ## 🚀 为什么选择Maru OS开发? Maru OS通过将Android与Linux桌面环境完美融合,开创了移动设备的全新使用方式。开发者可以利用这一独特架构,为用户打造无缝的跨设备体验。无论是个人学习还是商业项目,Ma

gitblog_00605的博客 445

Maemo Linux手机平台系列分析:8 Maemo平台开发之 使用Glib绑定的D-Bus

  使用Glib封装过的D-Bus这部分的内容: GObject介绍 使用XML文件定义D-Bus接口 自动生成proxy/stub代码 创建一个简单的D-Bus对象 通过D-Bus发布一个GType类型 客户端如何使用Glib封装过的D-Bus D-Bus的自省功能 GObject介绍为了在运行时

Linux智能手机--cuijpus的专栏 2764

maemo教程

http://maemo.org/development/documentation/tutorials/maemo_4-0_tutorial/#development

QuietHeart的专栏 742

构建Maemo软件包

 Maemo是Nokia开发的新一代手机操作系统,基于开源的Linux内核。为了更进一步的简化用户操作,Maemo在Debian的APT包管理系统之上,提供了一个非常简单易用的前端程序Application Manager。这里将简单介绍如何创建能够用于Maemo的软件包。假设我们的源码包括一个main.c文件和一个Makefile文件,存放到一个名为“hellodebia

Xizhi Zhu的博客 1736

尝试安装maemo开发平台

S60 的一个demo开发工作本周初告一段落,还有些残留问题,主要是回放自激励的问题,麦克风静音与回放冲突。 今天,历经一个下午,终于在ubuntu amd64的基础上搭建好maemo开发平台,暂时还没有正式开始开发。需要进一步适应ubuntu的使用习惯。

striker的专栏 589
上一篇: Broadcom推HSDPA+EDGE參考設計
下一篇: 传重组方案已获通过 网通联通启动股权置换
testhw
博客等级 码龄19年 172粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值