Skip to content

Archive

Tag: Android
从Android SDK R17开始,模拟器就支持OpenGL ES 2。如果能让KlayGE在模拟器上跑起来,开发和测试就能方便许多。于是我装了最新的R21和Android 2.1的ARM v7a的镜像,经过几个小时的努力,终于成功执行了一些原来能在Android x86 2.3上跑的简单例子。途中发现了一些小陷阱,这里总结一下。 屏幕宽高 原先我的做法是通过ANativeWindow_lock获得buffer,再拿buffer的width和height。在ICS上,这么做会导致后面eglCreateWindowSurface失败。原因似乎是ANativeWindow_lock之后这个窗口就被连到2D API,那么在eglCreateWindowSurface的时候就会说那个窗口已经被别的API连接了。即便是ANativeWindow_unlockAndPost也没用。解决方法是改成用ANativeW ...
在KlayGE的空框架跑起来之后,经过几天艰苦的debug,修正了多个KlayGE的bug,绕开更多Android的bug。现在,Text和Vertex displacement两个例子已经能在Android上顺利执行了。 Text例子。乱码不是bug,只因为系统区域没设置成中文。 Vertex displacement例子。 在移植的过程中,遇到的一个麻烦是NDK的ANativeWindow_getWidth和ANativeWindow_getHeight总是返回1,无法得到正确的窗口大小。结果viewport被错误地设置成1x1,使得渲出的东西都只有1个pixel。在修改了native_app_glue,获取resize的消息后,viewport大小终于得到了正确的设置。那两个例子才因此能正常执行。从这里也可以看出,Android的NDK千疮百孔,开发的时候要异常小 ...
今天CrystaX终于发布了从官方NDK r7修改而来的定制版Android NDK r7。主要的变化有: 宽字符 Google的NDK无法很好地支持宽字符,不管是在C还是C++里。CrystaX NDK含有完全兼容标准的宽字符支持,所以可以更容易地把使用了宽字符/string/stream的现有代码和新代码移植过去。 新的4.6.3工具链 从r7-crystax-1开始,CrystaX NDK包含了两个版本的编译器工具链:4.4.3(老的,和Google用的一样)以及4.6.3(新的)。 新工具链包含了GCC 4.6.3,它包含了Graphite framework,可以让gcc做一些高层内存优化。 为了兼容于Google的NDK,4.6.3工具链不是默认打开的。打开它需要在Application.mk里加一行: APP_TOOLCHAIN_VERSION := 4.6.3 ...
[zh] 继glloader移植到Android之后,KlayGE也可以在Android上执行了。虽然,严格来说,只是能跑最最基本的空框架。 由于我没有Android真机,模拟器又无法执行OpenGL ES 2,所以我的测试方法是在最老的Asus EeePC上执行Android x86。空框架EmptyApp目前可以顺利执行: [/zh] [en] After porting glloader to Android, KlayGE can be run on Android too. Technically, it's only a empty framework. Since I don't have a real Android device, and the emulator can't run OpenGL ES 2, I have to test it on an old Asus EeePC with Android x86. The empty framework "EmptyApp" runs well on it: [/en] [zh] ...
Android从NDK r5之后,就支持使用纯C/C++编写App。但按照NDK中的例子,纯C/C++写的代码总是异于其它平台。它的程序入口是void android_main(struct android_app* state),而不是其它平台通用的int main()。 就其本质,是因为android上没有其它平台的CRT来调用入口,而是通过android_native_app_glue这个库把native的代码和java端粘起来。所以,我们可以通过修改android_native_app_glue库,来实现和其它平台一样的int main()入口。 可以观察到,android_native_app_glue需要提供给android_main一个关键的参数:android_app指针。同时,android_main里面需要调用android_dummy()这个空函数来保证android_native_app_glue不会被优化器删 ...
glloader,作为KlayGE的一个子项目,是OpenGL扩展载入库,可以载入OpenGL 1.0-4.2,OpenGL ES 1.0-2.0,以及WGL、GLX等OpenGL扩展。只要编写xml脚本就能自动生成扩展载入代码。 在王锐的帮助下,glloader完成了移植到Android的工作。目前glloader可以用NDK r6和r7进行编译,在模拟器和真机Xoom上均测试通过。目前,支持Android的glloader代码可以在hg上找到。正式版本glloader 4.0将会在晚些时候发布。 这里有一个在Android NDK中使用glloader的例子,从NDK自带的native-activity修改而来。从这里可以看出,从原先的直接调用GLES改为使用glloader之需要修改#include和link选项。 native-activity.7z 需要注意的是,由于NDK r6的 ...
随着Android 4.0的发布,NDK也更新到了r7。不用白不用,我就下了一个试试。在初探的过程中,发现一些令人惊喜的地方。 惊喜1:不再需要Cygwin才能编译 这个惊喜其实在release note里就有提到,标记为Experimental features。 NDK r7提供了ndk-build.cmd和make等,可以直接在Windows上调用ndk-build了,不再需要Cygwin。但是ndk-gdb仍然必须有Cygwin才能debug。 惊喜2:wstring的支持 没有任何地方提到这一点,而且是默认关闭的。 原先的NDK在android-9下是支持wchar_t的,但是不支持wstring、wstringstream等。当需要用到那些的时候,就得用第三方定制的NDK,比如CrystaX NDK r6。但CyrstaX更新速度较慢,还没有对应于r7的版本。我 ...
From http://android-developers.blogspot.com/2011/11/updated-ndk-for-android-40.html Today we are releasing an updated version of the Android NDK, now in revision 7. The updated NDK lets developers who are using native code get started with the new native APIs available in Android 4.0. Android NDK r7 includes a number of build system improvements and bug fixes, but most importantly it gives you access to two new sets of APIs: Low-level streaming multimedia: A new API based on Khronos OpenMAX AL 1.0.1 provides a direct, efficient path for low-level streaming multimedia. The new path is ...
[zh] 本文的目的不是为了完整地把Python 3.2移植到Android,只是希望编译出能用在自己程序里的链接库。 完成boost 1.47的移植之后,下一个目标就是Python 3.2。目前Python只有2.6.2非官方地移植到了Android(见P4A),他们迟迟不开始移植3.x,主要原因是他们认为3.x没用-_-。看来这件事情只能自己做了。由于Python 3.x和之前的版本有着巨大的区别,其难度完全不可预测。 准备工作 需要下载 Python 3.2.0 Crystax's NDK r6 Cygwin P4A configure 按照linux平台的老习惯,很多配置是写在.in文件中,需要用configure来生成出对应的.c或者.h。这里需要特别注意的是,需要让configure用NDK的工具链: ./configure --host=a ...
[zh] 在PC上的C++开发中,boost已经很普遍。但对于Android这样的移动平台呢?由于KlayGE正在移植Android,作为依赖库之一的boost也必须移植过去。官方的boost并没有提供Android支持,看来得自己做了。 受MysticTreeGames的Boost-for-Android启发,我想用最新的Crystax NDK来编译boost 1.47。 准备工作 需要下载 boost 1.47 Crystax's NDK r6 MysticTreeGames的Boost-for-Android 补丁 首先,MysticTreeGames的补丁是基于boost 1.45和官方的NDK r5,在最新版上不一定能完美运作。因为有些源文件在1.45到1.47的过程中更改了,无法自动打上补丁。所以我手工地在原始的boost 1.47上根据补丁进行修改。其实不太难,因为只有12 ...