apktool 的使用

1.1 安装方法很简单,只需要下载解压到本地即可

$ wget https://android-apktool.googlecode.com/files/apktool1.5.2.tar.bz2
$ wget https://android-apktool.googlecode.com/files/apktool-install-macosx-r05-ibot.tar.bz2
$ tar -xvf apktool1.5.2.tar.bz2
$ tar -xvf apktool-install-macosx-r05-ibot.tar.bz2
$ mv apktool-install-macosx-r05-ibot/* apktool1.5.2/

1.1 查找帮助,直接执行apktool

$ cd apktool1.5.2
$ ./apktool

1.2 解包decode,会在当前目录创建与apk文件同名的目录

$ ./apktool d test.apk

1.3 打包build,会把当前test目录打包,打包后的未签名apk在test/dist下

$ ./apktool b test

1.4 关于如何重新签名看一下篇文章

Android

FILE_LIST := $(wildcard $(LOCAL_PATH)/目录1/*.cpp)
FILE_LIST += $(wildcard $(LOCAL_PATH)/目录2/*.cpp)

LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%)

树莓派 Raspberry Pi

$ sudo apt-get install bluetooth bluez-utils bluez-compat blueman libbluetooth-dev
#include 
#include 
#include <sys/socket.h>

#include <bluetooth/bluetooth.h>   //蓝牙的3个头文件.
#include <bluetooth/hci.h>
#include <bluetooth/hci_lib.h>

int main ( int argc , char **argv )
{
   inquiry_info *ii = NULL;
   int max_rsp, num_rsp;
   int dev_id, sock, len, flags;
   int i;
   char addr [19] = { 0 };
   char name [248] = { 0 };
   dev_id = hci_get_route (NULL);   //得到本地第一个可用的蓝牙设备

   sock = hci_open_dev(dev_id);    //用打开蓝牙设备.
   if( dev_id<0 || sock < 0) {
       perror("opening socket error") ;
       exit(1) ;
   }
   len = 8 ;
   max_rsp = 255 ;
   flags = IREQ_CACHE_FLUSH;
   ii = (inquiry_info*)malloc (max_rsp* sizeof ( inquiry_info)) ;
   
   printf("start search...\n");
   num_rsp = hci_inquiry(dev_id , len , max_rsp , NULL, &ii , flags) ;   //检索周围是否有设备
   if ( num_rsp < 0 ) perror ("hci_inquiry error") ;
   for ( i = 0 ; i < num_rsp ; i++) {
       ba2str (&(ii+i)->bdaddr , addr ) ;
       memset (name , 0 , sizeof (name)) ;
       if( hci_read_remote_name ( sock , &( ii+i )->bdaddr , sizeof (name) ,
          name , 0) < 0)   //查询设备的友好设备名
          strcpy (name , "[unknown]") ;
       printf ("%s %s \n", addr , name ) ;
   }
   printf("end search.\n");
   free(ii);
   close(sock);
   return 0;
}
</pre>

$ gcc -lbluetooth main.c
</section>

树莓派 Raspberry Pi

昨天买的Raspberry Pi到了,又有玩具玩了,打算是配置一个通用的环境。

1.1 OS X下通过下面的命令能够把镜像写入SD

$ unzip 2013-02-09-wheezy-raspbian.zip
$ df -h
$ sudo diskutil unmount /dev/rdisk1s1
$ sudo dd bs=1m if=2013-02-09-wheezy-raspbian.img of=/dev/rdisk1
$ sudo diskutil eject /dev/rdisk1

更新系统,由于基于debian,可以通过下面的命令更新升级

$ sudo apt-get update
$ sudo apt-get upgrade

升级内核

$ sudo apt-get install git-core
$ sudo wget http://goo.gl/1BOfJ -O /usr/bin/rpi-update && sudo chmod +x /usr/bin/rpi-update
$ sudo rpi-update

1.2 无线网卡配置</h3>

一同购买的无线网卡是EDUP EP-N8508GS黄金版,这个网卡有个小问题,就是当pi启动着的时候插入会重启。

$ sudo vim /etc/network/interfaces

删除原来wlan0的配置,当然上面会有lo有线的配置,不用管

allow-hotplug wlan0
auto wlan0
iface wlan0 inet dhcp
    wpa-ssid YOUR_SSID
    wpa-psk YOUR_PASSWORD

$ sudo ifdown wlan0
$ sudo ifup wlan0

配置ssh自动登录

$ brew install ssh-copy-id
$ ssh-copy-id pi@192.168.1.103
pi@192.168.1.103's password:
Now try logging into the machine, with "ssh 'pi@192.168.1.103'", and check in:

  ~/.ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

1.3 配置vncserver

参考:http://elinux.org/RPi_VNC_Server

刚好手上有一Nexus 7平板,可以通过Android连接vnc

$ sudo apt-get install tightvncserver
$ vncpasswd
$ vncserver :0 -geometry 1280x720 -depth 24

然后android安装android-vnc-viewer,通过简单的配置就能够连接上了,不过屏幕实在是小了点,玩一下还行,真正使用我觉得SSH会更好一些。

https://play.google.com/store/apps/details?id=android.androidVNC

1.4 修改swap分区大小

$ sudo vim /etc/dphys-swapfile
    CONF_SWAPSIZE=1024
$ sudo dphys-swapfile setup
$ sudo dphys-swapfile swapon
$ free -m

1.5 安装golang

$ export GOARM=5
$ mkdir repos && cd repos
$ hg clone -u release http://code.google.com/p/go
$ cd go/src
$ ./make.bash #只编译,不进行测试,如果测试会无法通过
$ vim ~/.zshrc
export GOARM=5
export GOROOT=/home/pi/repos/go
export GOPATH=/home/pi/go

export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

1.6 安装zsh

$ sudo apt-get install zsh
$ curl -L https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh | sh
$ chsh -s /bin/zsh

1.7 安装nodejs

$ axel -n 10 http://nodejs.org/dist/v0.10.4/node-v0.10.4.tar.gz
$ tar -zxvf node-v0.10.4.tar.gz
$ cd node-v0.10.4
$ ./configure
$ make
$ sudo make install
$ node --version
$ npm version

1.8 挂载树莓派的某个文件夹到本地

安装osxfuse和sshfs: "http://osxfuse.github.io/":http://osxfuse.github.io/

$ sshfs pi@192.168.1.103:/var/www www

1.9 使用raspberrypi.local访问树莓派

$ sudo apt-get install avahi-daemon
$ ssh pi@raspberrypi.local
</section>

很不错的手册:http://elinux.org/RPi_Tutorials

C++的extern "C"

使用原则: 当在C++中引用C的函数或变量,在包含C头文件的时候应该使用extern "C"。

ps: C的函数或变量指的是通过gcc编译的c文件。

1.1 utils.h

#ifndef __utils_h__
#define __utils_h__

void add(int, int);

#endif

1.2 utils.c

#include "utils.h"

void add(int x, int y) {
    int c = x + y;
}

1.3 main.cpp

#include 

#ifdef __cplusplus
extern "C" {
#endif

#include "utils.h"

#ifdef __cplusplus
}
#endif

int main(int argc, char* argv[]) {
    std::cout << "Hello World!!\n";

    int x = 20;
    int y = 40;

    std::cout << x << " + " << y << " = " << add(x, y) << "\n";
    return 0; 
}
</pre>
# 标准的编译方式
$ gcc -c -Iinclude src/utils.c          # 通过gcc编译c文件
$ g++ -Iinclude utils.o src/main.cpp    # 通过g++编译c++文件

# 非标准的编译方式
$ g++ -c -Iinclude src/utils.c          # 使用g++编译c文件,会对函数名进行编码
$ g++ -Iinclude utils.o src/main.cpp    # g++编译main.cpp时,由于包含extern "C"会编译
                                        # 不通过,如果想通过g++来编译c文件,extern "C"
                                        # 应该不添加
</section>

由于.c文件不支持extern "C",所以第二种用法就是使用.cpp编写c函数或变量

2.1 utils1.h

#ifndef __utils1_h__
#define __utils1_h__

void add1(int, int);

#endif

2.2 utils1.cpp

#ifdef __cplusplus
extern "C" {
#endif

#include "utils1.h"

#ifdef __cplusplus
}
#endif


void add1(int x, int y) {
    int c = x + y;
}

2.3 main1.cpp

#include 

#ifdef __cplusplus
extern "C" {
#endif

#include "utils1.h"

#ifdef __cplusplus
}
#endif


int main(int argc, char* argv[]) {
    std::cout << "Hello World!!\n";

    int x = 20;
    int y = 40;

    std::cout << x << " + " << y << " = " << add1(x, y) << "\n";
    return 0; 
}
</pre>
$ g++ -Iinclude src/utils1.cpp src/main1.cpp # 在.cpp中编写c函数或变量时包含头文件时
                                             # 应该使用extern "C",然后统一使用g++
                                             # 进行编译
</section>

源码

</br>