分析了“HelloWorldConsole”样例和PlayBook NDK的事件处理机制后让我们来看看PlayBook NDK中的第二个样例“HelloWorldDisplay”。
样例“HelloWorldDisplay”就是之前NDK Beta中的“HelloWorld”样例,之前的博文也介绍过,程序启动后在屏幕上显示一张底图和“HelloWorld”字样。
既然我们已经开始理解PlayBook NDK上的事件处理机制,就让我们更深入看看“HelloWorldDisplay”的代码。
“HelloWorldDisplay”项目中有main.c,bbutil.h,bbutil.c三个文件,其中bbutil.h和bbutil.c文件中提供了一些工具函数,用于实现一些具体的工作,本文先不作详细介绍,这里主要先看看main.c中的代码。
从main.c中的main函数开始,开始首先是对PlayBook屏幕环境的初始化,代码如下:
screen_create_context(&screen_cxt, 0);
函数screen_create_context是在头文件<screen/screen.h>中声明的,用于初始化PlayBook得屏幕环境,对于需要图形界面的程序这一步都是需要的。
其中的参数是指向screen_cxt的指针,而screen_cxt在main.c文件开头进行了声明,声明如下:
static screen_context_t screen_cxt;
初始化屏幕后就需要进行BPS的初始化工作,主要是为了后面的事件处理。如之前的博文提到的,BPS初始化工作通过调用bps_initialized()函数完成,代码如下:
bps_initialize();
完成了BPS的初始化工作后开始为屏幕设置egl,完成egl初始化工作,启动openGL。
egl的初始化过程比较复杂,样例中这些代码被放在bbutil.c中进行定义,在main.c中就简单调用bbutil_init_egl()函数完成。这里不详细讲述egl的初始化过程,有兴趣的同学可以打开bbutil.c文件仔细看看。
bbutil_init_egl()函数的调用代码如下,调用完成后会对调用结果进行判断,如果调用失败则对screen_cxt进行释放。
if (EXIT_SUCCESS != bbutil_init_egl(screen_cxt)) {
fprintf(stderr, "Unable to initialize EGL\n");
screen_destroy_context(screen_cxt);
return 0;
}
进一步是样例本身的初始化工作,主要是加载字体,并定义顶点数组和纹理坐标数组,所有初始化代码放在main.c的init()函数中。
//Initialize app data
if (EXIT_SUCCESS != init()) {
fprintf(stderr, "Unable to initialize app logic\n");
bbutil_terminate();
screen_destroy_context(screen_cxt);
return 0;
}
然后是调用navigator_rotation_lock()函数锁定屏幕,不响应PlayBook方向变化的动作。
接着通过screen_request_events()函数和navigator_request_events()函数向BPS请求屏幕事件和“Navigator”事件。这两部分的代码是该样例事件处理的重要部分。
//Signal BPS library that navigator orientation is to be locked
if (BPS_SUCCESS != navigator_rotation_lock(true)) {
fprintf(stderr, "navigator_rotation_lock failed\n");
bbutil_terminate();
screen_destroy_context(screen_cxt);
return 0;
}
//Signal BPS library that navigator and screen events will be requested
if (BPS_SUCCESS != screen_request_events(screen_cxt)) {
fprintf(stderr, "screen_request_events failed\n");
bbutil_terminate();
screen_destroy_context(screen_cxt);
return 0;
}
if (BPS_SUCCESS != navigator_request_events(0)) {
fprintf(stderr, "navigator_request_events failed\n");
bbutil_terminate();
screen_destroy_context(screen_cxt);
return 0;
}
已经完成初始化工作后就进入事件循环,在事件循环中通过bps_get_event()函数获取事件,如果事件获取成功则对事件进行处理。本例对事件的处理很简单,只响应退出事件,当退出事件发生时跳出事件循环。
事件处理完成后调用render()函数完成屏幕绘制工作,所有绘制工作在main.c的update()函数中完成,主要是通过openGL的相关函数展现顶点数组对应的矩形,同时显示纹理。
有关如何通过openGL显示图形我们在之后的文章中继续讨论。
这里还要注意一点的是调用bps_get_event时使用了0为参数,意味着如果没有事件发生,程序不会阻塞,而会继续运行。也就是说该样例一直在重画屏幕上显示的内容,虽然我们看见的只是一张静态的底图和“Hello World”字样。
for (;;) {
//Request and process BPS next available event
bps_event_t *event = NULL;
rc = bps_get_event(&event, 0);
assert(rc == BPS_SUCCESS);
if ((event) && (bps_event_get_domain(event) == navigator_get_domain())
&& (NAVIGATOR_EXIT == bps_event_get_code(event))) {
break;
}
fprintf(stderr,"Trying to render \n");
render();
}
如果退出事件发生,程序会跳出事件循环继续执行下面的资源释放代码:
//Stop requesting events from libscreen
screen_stop_events(screen_cxt);
//Shut down BPS library for this process
bps_shutdown();
//Destroy the font
bbutil_destroy_font(font);
//Use utility code to terminate EGL setup
bbutil_terminate();
//Destroy libscreen context
screen_destroy_context(screen_cxt);
return 0;
通过对“HelloWorldDisplay”样例的分析我们可以完整地看到一个PlayBook NDK应用程序的运行过程,包括应用的初始化,事件循环和资源释放三个重要的部分。
有关如何使用OpenGL在PlayBook上进行绘图,我们后面继续讨论。
分享到:
相关推荐
BlackBerry NDK,全称是BlackBerry Native Development Kit,是一个专为BlackBerry PlayBook和BBX操作系统的原生应用程序开发而设计的工具集。它允许开发者使用C和C++语言来编写应用程序,直接访问设备的底层硬件...
在这种背景下,“黑莓PlayBook平台下的工程示例”显得尤为珍贵,它们为开发者提供了宝贵的参考和学习材料,特别是对于那些想要利用NDK(Native Development Kit)进行原生代码编程的开发者。 NDK是黑莓平台上的一个...
Playbook一键刷机教程 本文档提供了Playbook一键刷机的详细教程,旨在帮助用户快速刷机并升级到最新的1917系统。本教程解决了之前版本的BUG,包括修复桥接的BUG、取消了浏览器、摄像机和BBworld的安装、降级后直接...
"黑莓Playbook原生浏览器输入法"这个主题聚焦于黑莓平板电脑上的浏览器输入体验,特别是对于中文用户而言。黑莓Playbook是一款搭载BlackBerry Tablet OS系统的平板电脑,尽管其市场份额相对较小,但对于用户来说,...
- **目的**: 为了测试转换后的应用,需要将PlayBook设备升级至2.0版本的Beta测试版。此操作需在官网注册并等待批准。 - **链接**: [https://bdsc.webapps.blackberry.com/android/beta/bbtablet20/register/]...
### 2010 BlackBerry PlayBook上的设备集成 #### 议程回顾与核心知识点 **议程** - 前两周网络研讨会回顾 - 摄像头 - 设备传感器 - 应用的生命周期 - 滑动手势 - 设备信息 - 活动指示标识 - 电池电量和事件 - ...
PlayBook中文说明书,BlackBerry_PlayBook_Tablet-T1526983-1526983-0213114900-011-2.0-ZH.pdf
黑莓PlayBook 是黑莓公司2010年发布的平板电脑,定于2011年正式上市,该平板电脑的配置相当高,配备黑莓自己研发的操作系统。 规格参数 网络制式:CDMA2000/CDMA1X EV-DO 重 量 :400 克 尺寸/体积:193...
黑莓Android Player的推出极大地丰富了BlackBerry PlayBook的应用生态,使得用户能够享受到更广泛的应用程序选择。虽然目前存在一些功能限制,但随着技术的不断进步和版本迭代,未来的Android Player将会更加完善,...
【标题】"Virtual Keyboard for BlackBerry PlayBook: BlackBerry PlayBook 的虚拟键盘。俄罗斯布局实施。-开源"揭示了这个项目的核心内容是为BlackBerry PlayBook设计的一款虚拟键盘,并且特别强调了它采用了俄罗斯...
“支持所有版本黑莓(包括PlayBook系列)的桌面管理器的备份bbb、 ipd和新的bbb v2文件,从BlackBerry备份恢复任何文件(加密或未加密),安装适用于Windows、Mac、OS X、 Linus设备。自动提取转换成CSV、vCard或...
在IT行业中,Playbook通常指的是BlackBerry PlayBook,这是一款由BlackBerry(原RIM公司)推出的平板电脑。本文将围绕Playbook如何调用云输入法进行深入探讨,特别是针对在设备内置的浏览器中启用中文输入法的方法。...
KubeOperator 3.0 Ansible剧本安装netaddr模块pip安装--no-cache-dir netaddr == 0.7.19 -i 执行安装ansible-playbook -i托管90-init-cluster.yml
BlackBerry PlayBook是一款由加拿大公司RIM(Research In Motion)推出的平板电脑,它以其独特的操作系统BlackBerry Tablet OS吸引了一部分用户。本项目专注于为BlackBerry PlayBook提供稳定的拼音和五笔输入法解决...
《Microsoft Partner Playbook 20190319》是微软为合作伙伴提供的一份重要指南,旨在帮助他们更好地理解并利用微软的技术、资源和策略,以提升业务表现和客户满意度。这份Playbook包含了丰富的信息,包括最新的市场...
本文档旨在指导Windows开发者如何使用BlackBerry Tablet OS SDK for Adobe AIR创建适用于BlackBerry PlayBook平板电脑的应用程序。此文档提供了从安装SDK、配置模拟器到创建并测试应用程序的全过程指南。 #### 应用...
当我们谈论"openssh升级ansible-playbook"时,意味着我们需要使用Ansible的Playbook来自动化OpenSSH的更新过程。 首先,让我们详细了解一下Ansible Playbook。Playbook是Ansible的核心概念,它是以YAML格式编写的...
playbook-v1.3镜像
用于 openFrameworks 的 BlackBerry PlayBook 和 BlackBerry 10 插件 项目页面: : 存储库: : 版权所有 (C) 2012-2015 劳伦斯穆勒 接触 网站: : 执照 新 BSD 许可证(3 条款许可证) 见 要求 一个打过补丁的...
Ansible之Playbook使用 Ansible之Playbook使用是 Ansible 的一个核心组件,playbook 是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。Playbook 可以...