编写 android.mk 中 LOCAL_C_INCLUDES 的技巧

已废弃, 请参考Update: Android.mk 中的 LOCAL_SRC_FILES, LOCAL_C_INCLUDES

在编写android.mk的过程中,免不了要修改LOCAL_C_INCLUDES来设置头文件的include目录, 一般写成这样

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes \
                     $(LOCAL_PATH)/../../Classes/game \
                     $(LOCAL_PATH)/../../Classes/logic \
                     $(LOCAL_PATH)/../../Classes/view                    

有一个目录就要写一行, 实在繁琐, 有没有写法可以把源码目录下的所有子目录都引入呢, 看下面

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes
LOCAL_C_INCLUDES += $(shell ls -FR $(LOCAL_C_INCLUDES) | grep $(LOCAL_PATH)/$ )
LOCAL_C_INCLUDES := $(LOCAL_C_INCLUDES:$(LOCAL_PATH)/%:=$(LOCAL_PATH)/%)

即可把$(LOCAL_PATH)/../../Classes目录和子目录全部包含进来

还有一种写法, 就是使用sed命令, 效果是一样的, 我对sed不是很熟悉, 简单写了一下

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes    
LOCAL_C_INCLUDES += $(shell ls -FR $(LOCAL_C_INCLUDES) | grep $(LOCAL_PATH)/$ | sed "s/:/ /g" )

这两行和上面三行的结果是一样的

如果要方便的引入源文件到android.mk文件里, 可以参考我的这篇post:编写Android.mk中的LOCAL_SRC_FILES的终极技巧

以上代码在 mac + NDK r8e 下测试通过

Mac下的命令行小程序调用词典查单词

查个单词还得打开词典app或才打开浏览器到google翻译, 这对于大多时间在终端中的我们来说来回切换窗口实在是不方便, 提供一个小程序可以在命令行下查单词

使用你喜欢的编辑器创建源文件dict.m, 比如,我这里是

mate dict.m

main.m文件里输出我们的程序代码, 看我的写的简单注释就能懂了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
@autoreleasepool {
//判断参数, 如果参数不对, 打印使用方法
if(argc < 2)
{
printf("Usage: %s [word to translate]\n", argv[0]);
printf("示例: \n%s apple\n", argv[0]);
return -1;
}
//获取需要查找的单词
NSString * search = [NSString stringWithCString: argv[1] encoding: NSUTF8StringEncoding];
//通过CoreServices查找单词的翻译
CFStringRef def = DCSCopyTextDefinition(NULL,(CFStringRef)search,CFRangeMake(0, [search length]));
//输出结果
NSString * output = [NSString stringWithFormat: @"Definition of <%@>:%@\n", search, (NSString *)def];
printf("%s", [output UTF8String]);
}
return 0;
}

所有的代码就是这些了, 其中使用了DCSCopyTextDefinition,可到苹果开发网站上查看详细介绍.

编译源文件dict.m, 我这里使用clang, 你也可以使用gcc

clang dict.m -o dict -framework CoreServices -framework Foundation -O2

Read More

黑苹果升级Mac OS X 10.8.4

我这台黑苹果已经比较完美,平时使用没有任何问题, 今天看到App Sotre里有10.8.4的更新, 备份/System/Library/Extensions后直接点击下载安装更新, 重启时加参数-f, 进入系统后声卡失效, 重新安装备份的声卡驱动, 一切正常, 其他驱动未动, 显卡正常, 睡眠正常

update SeaBIOS on Google Chromebook Pixel

Google的新笔记本chromebook pixel支持Corebook启动SeaBIOS,这样就可以启动安装Windows,Linux,甚至Mac OS X操作系统
Pixel自带的SeaBIOS版本是SeaBIOS Version: 20121017_154325-build69-m2,[SeaBIOS]是开源软件,我们可以升级这笔记本自带的版本

  1. 设置笔记本进入开发者模式

    关机,按住ESC键和Refresh键,再按电源键开机.
    按Ctrl+D键,确认,会清空所有文件和设置,并重启到dev-mode
    警告界面,按Ctrl+D进入Chrome OS, 按Ctrl+L进入SeaBIOS,这里按Ctrl+D进入Chrome OS
    进入后,按Ctrl+Alt+T打开Shell界面,输入以下命令

     shell
     sudo bash
     crossystem dev_boot_usb=1 dev_boot_legacy=1
    

    经过以上设置后,在开机界面即可按下Ctrl-L键进入SeaBIOS,并引导U盘等外部存储

  2. 升级SeaBIOS
    下载SeaBIOS For Pixel的20130425版本文件http://www.coreboot.org/~stepan/seabios.cbfs.bz2,解压得到seabios.cbfs,放入U盘备用
    进入Chrome OS系统, 插入保存有升级固件的U盘,按Ctrl+Alt+T打开Shell界面,升级命令如下

     shell
     sudo bash
     cd /media/removable/USB_NAME   #USB_NAME是U盘上分区的名称
     flashrom -r image.rom.origin   #备份原来的固件
     cp image.rom.origin image.rom  #复制一份,准备操作
     dd if=seabios.cbfs of=image.rom seek=2 bs=2M conv=notrunc   #将下载的新SeaBIOS写入固件镜像文件
     flashrom -w image.rom -i RW_LEGACY  #将固件刷入设备
    
  3. 重启,按Ctrl-L,就可以看到新版本的SeaBIOS.

参考资料:
Chromebook Pixel
Updating SeaBIOS on a Chromebook

[原创]编写Android.mk中的LOCAL_SRC_FILES的终极技巧

已废弃, 请参考Update: Android.mk 中的 LOCAL_SRC_FILES, LOCAL_C_INCLUDES

问题的引入

在使用NDK编译C/C++项目的过程中,免不了要编写Android.mk文件,其中最重要的就是LOCAL_SRC_FILES源文件列表.
考虑有如下源文件分布的情况:

cpp文件全部位于android项目下的jni文件夹下,结构如下

    jni    
     |---1.cpp
     |---2.cpp
     |---Android.mk
     |---Application.mk
     |---ndk_test.cpp
     |---src    
     |    |---core
     |    |    |---core1.cpp
     |    |    |---core2.cpp
     |    |---src1.cpp
     |    |---src2.cpp

按照通常的写法,在android.mk中,应该写入

LOCAL_SRC_FILES := ndk_test.cpp \
                1.cpp \
                2.cpp \
                src/src1.cpp \
                src/src2.cpp \
                src/core/core1.cpp \
                src/core/core2.cpp

繁琐不堪!

初步解法:一句话引入单个目录(不包括子目录)下的所有cpp源文件

Read More

使用Clover 修正被黑苹果识别为 HD 6xxx 的 HD 6450显卡

AMD HD6450 显卡在黑苹果(OS X 10.7 和 10.8)下是免驱动,不需要任何设置直接就可以使用的,唯一的不足就是系统没有正确识别显卡型号,显卡为 “AMD Radeon HD 6xxx“,平时是不影响使用的
造成这个问题的原因是苹果的显卡驱动ATI6000Controller.kext中的FrameBuffer配置和显卡不合适,以往的解决方法是对ATI6000Controller.kext打补丁,但是往往系统升级后就会失败,还得重新打补丁,这里我用Clover作系统的引导器,它可以在系统启动的过程中动态的修改ATI6000Controller.kext,这样只要把对FrameBuffer的修改写到Clover的配置文件里,再也不怕系统升级更新驱动文件了

Read More

去除警告 Android NDK: WARNING: APP_PLATFORM android-14 is larger than android:minSdkVersion 8

使用ndk-build编译项目的时候会看到一个警告“Android NDK: WARNING: APP_PLATFORM android-14 is larger than android:minSdkVersion 8”,虽然”不怎么”影响结果,看着碍眼

解决方法

在项目里的jni/Application.mk文件里加入一行

APP_PLATFORM := android-8

即可.

为什么会有这个警告?

在android上项目里,可以在AndroidManifest.xml中写入

<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17"/>

来表示程序可以运行的最低android设备是android 2.2(API Version 8), 经过详细测试的目标android版本是android 4.2.2(API Version 17).这里定义的是Java API Version

再来看一下ndk(版本r8e)目录下的platforms文件夹,可以看到

android-3
android-4
android-5
android-8
android-9
android-14

一共有6个文件夹,分别表示相应的Native API Version


看到这里就明白了,那个警告的意思就是说,使用的Native API Version比最低版本Java API要高,可能导致的问题就是:
在Native Code里使用了一个platforms/android-14下的API函数,然后程序在 android-8 的设备上运行,当然这个函数在android-8设备上是不存在的,就会崩溃了


为什么Native API的版本数量会少于Java API?

因为android在版本升级的时候,有时候只升级了Java层的API,而Native层的却没有变化

[原创]使用eclipse调试cocos2d-x Native C++ 代码

前提条件:

windows下可以参考夜阑卧听风吹雨的让人死去活来的cocos2d-x安卓开发环境搭建(windows+eclipse+ndk 不用cygwin)

安装NDK Plugin

英文好的同学可以直接查看官方说明Using the NDK plugin,这里我简单翻译一下

  1. 打开eclipse,在菜单里选择Help->Install New Software…
  2. 弹出的窗口里第一个框”Work with:”后面输入https://dl-ssl.google.com/android/eclipse/
  3. 稍等一会,下面会出来”Developer Tools”和”NDK Plugins”,全部选中,Next,同意协议,等安装完成后,重启eclipse
  4. eclipse重启后,到Eclipse->Preferences->Android->NDK,在这里设置你的NDK目录,比如我的,我设置到/android/android-ndk-r8e
  5. 安装完成

导入cocos2d-x目录下的示例游戏

这里我以cocos2d-2.1rc0-x-2.1.3/samples/Cpp/SimpleGame这个自带的小游戏为例子来说明一下.

Read More