編輯:關於Android編程
在Android上運行C程序對於做上層App的童鞋來說有些陌生,因為目前的Android應用開發怎麼還是繞不過Java。
但對於底層驅動開發者,這就是家常便飯一樣,因為Android是Linux分支,底層是C/C++的世界。
有時為了測試一些功能,我們也會編寫直接運行在Android終端下的C程序。前提是有Android交叉編譯器以及Android系統的root權限。
ndk為我們開發native程序做了很多工作,下面我們將Android交叉編譯工具從ndk中分離出來。
我的系統是64位的Ubuntu 14.04,所以我就下載了64位ndk(android-ndk-r10e-linux-x86_64.bin)。
ndk$ chmod a+x android-ndk-r10e-linux-x86_64.bin
ndk$ ./android-ndk-r10e-linux-x86_64.bin
此時,ndk就可以工作了。讓我們將交叉編譯工具變出來吧。
$ ./build/tools/make-standalone-toolchain.sh --platform=android-19 --toolchain=arm-linux-androideabi-4.9
Copying prebuilt binaries...
Copying sysroot headers and libraries...
Copying c++ runtime headers and libraries...
Creating package file: /tmp/ndk-linc/arm-linux-androideabi-4.9.tar.bz2
Cleaning up...
Done.
找到合適的路徑,解壓:
build-tools$ tar jxvf arm-linux-androideabi-4.9.tar.bz2
arm-linux-androideabi-4.9/
...
編譯c文件main_test.c
#include
int main() {
printf(just a test,linc!hello, native!
);
return 0;
}
編譯它:
$ ~/bin/build-tools/arm-linux-androideabi-4.9/bin/arm-linux-androideabi-gcc -o main_test main_test.c
跑起來:
將main_test拷到Android中運行:
$ adb push main_test /data/app
137 KB/s (6192 bytes in 0.043s)
$ adb shell
root@hammerhead:/ # cd data/app
root@hammerhead:/data/app # ls
main_test
root@hammerhead:/data/app # ./main_test
just a test,linc!hello, native!
如我們所願,程序順利的運行起來,跟在Linux系統中一樣。下面我們來編譯兩個文件的程序。
shooter.c
#include shooter.h
#include
void bubble_sort(int *array,int n) {
int i,j,tmp;
for(i=0;ii;j--) {
if(array[j-1]>array[j]) {
tmp = array[j-1];
array[j-1]=array[j];
array[j]=tmp;
}
}
}
}
int A(int a) {
int n = 10;
int i;
int array[] = {54,12,346,5,23,67,234,324,45,98};
for(i=0;i
shooter_tester.c
#include
#include shooter.h
int main() {
int result = A(0);
printf(A result: %d
,result);
return 0;
}
編譯運行之:
$ ~/bin/build-tools/arm-linux-androideabi-4.9/bin/arm-linux-androideabi-gcc -o test shooter_tester.c shooter.c
$ adb push test /data/app/
143 KB/s (6344 bytes in 0.043s)
$ adb shell
root@hammerhead:/ # cd data/app
root@hammerhead:/data/app # ./test
54, 12, 346, 5, 23, 67, 234, 324, 45, 98,
A result: 5
使用隨機數
接下來嘗試將《做一個動態鏈接庫》中的代碼在Android下測試,准備將此so移植到Android平台。
shooter.c只是將上面的程序用rand和srand生成隨機數。
#include shooter.h
#include
#include
void bubble_sort(int *array,int n) {
int i,j,tmp;
for(i=0;ii;j--) {
if(array[j-1]>array[j]) {
tmp = array[j-1];
array[j-1]=array[j];
array[j]=tmp;
}
}
}
}
int A(int a) {
int n = 10;
int i;
int array[n];
srand(time(NULL));
for(i=0;i
只是編譯的時候遇到了問題:
error: undefined reference to 'srand'
error: undefined reference to 'rand'
原來是隨機數方法的頭文件變成了stdlib,引入就可以了。
《Android問題集錦之四十五:undefined reference to ‘srand’》
編譯運行結果如下:
$ ~/bin/build-tools/arm-linux-androideabi-4.9/bin/arm-linux-androideabi-gcc -o test shooter_tester.c shooter.c
$ adb shell
root@hammerhead:/ # cd data/app
root@hammerhead:/data/app # ./test
18, 95, 91, 55, 13, 37, 74, 85, 83, 66,
A result: 13
root@hammerhead:/data/app # ./test
59, 100, 84, 32, 26, 46, 11, 50, 44, 83,
A result: 11
尾聲
現在,可以把Android當成Linux玩了。祝你愉快!
引言最近在工作中由於需要客制化系統的關系,接觸到了很多ViewPager相關的UI,發現很多底層原生的界面也還是依然采用ViewPager+Fragment的布局方式,事
首先看下我們想要實現的效果如下圖(qq聊天中發送圖片時的效果):再看一下我實現的效果: 1、效果已經看見了,下面我們來實現它。首先我創建一個android工程P
(一)概述ImageView主要是用來顯示圖片的控件,可以對圖片進行放大、縮小和旋轉的功能。(二)ImageView中src和BackGround屬性的區別No.1 &m
最近心血來潮,寫了一個自定義仿iPhone的開關。有需要的同學可以來下載啦。支持點擊自動滾動,速率可以自己根據需要修改。觸摸滾動,大小自定義,支持修改樣式。就不錄制動畫,