標籤:android des blog class code java
Android C編程技巧
運行模擬器
emulator -console
* 將檔案寫入到模擬器的userdata.img檔案中
adb push
*將一個目錄拷貝到模擬器中,包括子目錄
adb push
* 將一個目錄從模擬器中拷出來
adb pull
* 使得模擬器可以運行arm代碼.
使用GNU/ARM Linux編譯器編譯你的應用程式就可以了
* 在模擬器裡面運行shell,需要先運行模擬器
adb shell
*運行模擬器中的一個控制台程式
adb shell
*串連模擬器的控制台
telnet localhost 5554/6/8
運行C程式
參考文獻
Native C "Hello World" working in emulator
http://groups.google.com/group/a ... wse_thread/threa...
Native C Applications for Android
http://benno.id.au/blog/2007/11/13/android-native-apps
步驟
* 下載GNU/ARM編譯工具
http://www.codesourcery.com/gnu_toolchains/arm/download.html
* 編寫c/c++代碼.
* 使用GNU/ARM Linux 工具建立一個應用程式,不使用動態連結程式庫
ex. arm-none-linux-gnueabi-g++.exe -static -o hello HelloAndroid.cpp
* 啟動模擬器
$SDK_ROOT/tools/emulator.exe
* 在命令列視窗運行 abd將編譯好的hello程式放入模擬器的磁碟
adb push hello /system/sbin/hello
* 讓hello檔案變成可執行程式,不要使用 chmod ugo+x
adb shell chmod 777 /system/sbin/hello
* 運行hello程式
adb shell
cd /system/sbin/
hello
EXAMPLE HELLO WORLD CODE
//
// HelloAndroid.cpp
//
//
#include
using std::cin;
using std::cout;
using std::endl;
class MyName
{
public:
void getname( void );
void sayhello( void );
private:
char name[ 255 ];
};
void MyName::getname( void )
{
cout << "What is your name? ";
cin >> name;
}
void MyName::sayhello( void )
{
cout << "Welcome " << name << " to the world of Android" << endl;
}
MyName name;
int main( int argc, char *argv[] )
{
name.getname();
name.sayhello();
return 0;
}
Android編譯本地C++程式方法
在Android平台上程式以Java形式運行在Dalvik模擬器上,但Android作為一個Linux核心系統完全可以執行Navtive C++程式,主要的步驟如下:
1.下載ARM C++交叉編譯器http://www.codesourcery.com/gnu_toolchains/arm/portal/subscription3057
2.編寫本地C++代碼,如Hello Wolrd,可以使用標準庫STL。編譯的命令列如下
arm-none-linux-gnueabi-g++.exe -static -oandroid123 android123.cpp
首先運行arm-none-linux-gnueabi-g++.exe程式-static 參數代表靜態庫,-o為輸出名稱android123,最後的android123.cpp為原始碼。
3.運行模擬器,用cmd在sdkTools目錄夏之星 adb pushandroid123 /system/sbin/android123
4.設定存取權限,通過Linux的Shell,在cmd下設定所有使用者完全控制許可權adb shell chmod 777 /system/sbin/android123
5.執行這個android123程式,輸入adb shell cd /system/sbin/android123
即可
在android平台上測試C/C++程式及庫
int main( int argc, char *argv[] )
{
name.getname();
name.sayhello();
return 0;
android平台上帶有標準C庫,我們可以寫個C程式來試試看能不能在上面運行。。。
首先下載並安裝交叉編譯工具GNU/ARM Linux gcc:
http://www.codesourcery.com/gnu_toolchains/arm/download.html
安裝時 直接解壓就行了,要設定好PATH環境變數。
簡單的C代碼:
test.c
#include <stdio.h>
int main()
{
int i,j;
for(i=0;i<=10;i++)
{
for(j=0;j<=i;j++)
printf(”*”);
printf(”n”);
}
return 0;
}
用剛下載的交叉編譯工具編譯原始碼:
# arm-none-linux-gnueabi-gcc test.c -o test -static
-static選項在這裡是必須的,不然android平台就不運行此程式。
這也說明了此平台上的C/C++庫是不能被C/C++程式動態串連的 。
進入tools目錄,用adb工具下載到android平台,放到/data/data目錄。
# ./adb push test /data/data
進入/data/data目錄運行程式。
# cd /data/data
# ./test
*
**
***
****
*****
******
*******
********
*********
**********
***********
ok,It’s done !
C++程式一樣的方法,只不過編譯器換成:arm-none-linux-gnueabi-g++
附C++範例程式碼:
//
// HelloAndroid.cpp
//
//
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
class MyName
{
public:
void getname( void );
void sayhello( void );
private:
char name[ 255 ];
};
void MyName::getname( void )
{
cout << “What is your name? “;
cin >> name;
}
void MyName::sayhello( void )
{
cout << “Welcome “ << name << ” to the world of Android” << endl;
}
MyName name;
}
上面的應用程式在編譯時間必須加上-static選項,也就是在編譯時間將函數都靜態編譯到程式中了,運行時不用再動態串連。如果不加此選項,在android平台上就不讓運行。
經過測試,將自己寫的庫放到/system/lib目錄下,然後寫個主程式來動態串連,也是無法運行。
看來此平台做了限制,不讓C/C++的程式運行時動態串連到這些C/C++庫。