2015年3月31日火曜日

androidでもコマンドプログラム開発

androidのコマンドをC言語で開発する方法が書いてあった。
http://www.kako.com/neta/2010-021/2010-021.html
やはり開発はHELLO WORLDをCUIにだすところから始まると信じる人間なのでこれをやってみた。
あっさりできたので覚え書きとして残す。

まずNDKのndk-buildにパスを通しておく。
このやり方はいちいち説明しない。

次にどこでもいいので作業フォルダを作成
~/hello
とする。
次にC言語のソースフォルダを作成
~/hello/jni
とする。
次にC言語ソースを作成
場所はここ
~/hello/jni/hello.c
中身はこれ

#include
int main(){
   printf("Hello,world\n");
   return 0;
}

この意味は説明しない。わかる人はわかるハズ。

次にMAKEFILE
場所はここ
~/hello/jni/Android.mk
中身はこれ

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello
LOCAL_SRC_FILES := hello.c
include $(BUILD_EXECUTABLE)


これはもう感じてくれというしかない。
androidのMAKEFILEはこうなんだと感じてください。

環境は整った。
そこでビルドしてみる。
これ参照サイトに書いているようにスクリプトを書いてもいいんだが
私の場合ndk-buildにパスを通しているのでそのままする。

cd ~/hello/
ndk-build
場所に注意、~/hello/でしないといけない。

出力はこんな感じ
$ ndk-build
[armeabi] Compile thumb  : hello <= hello.c
[armeabi] Executable     : hello
[armeabi] Install        : hello => libs/armeabi/hello

出力に書いているように
~/hello/libs/armeabi/hello
がその出力ファイルだ。
次にこれをandroidに持っていく
まず結論からいうと/data/フォルダに持って行かないとうまく動作しない

adb push hello /data/hello
とするとアクセス権がないと怒られる

そこで一旦/sdcard/にコピー
$adb push hello /sdcard/
152 KB/s (9496 bytes in 0.060s)

こんな感じで成功するのでここでまた
$adb -d shell
でandroidに入りsuでrootになったあとで(root権限必要)
#cp /sdcard/hello /data/hello
実行権追加
#chmod 755  /data/hello

これで動作します
$ /data/hello                                               
Hello,world

こんな感じ





これと同じ事を/sdcard/でやってもなぜか失敗する
理由は/sccard/はnoexec 付きでmountされてるから
http://blogger.splhack.org/2008/12/android-dev-phone-1-2.html


最後にこれを$PATHのどこか、たとえば/system/binに持っていく
 このままcpで/system/binにコピーするとreadonlyですとおこられる。
そこで rootで
# mount -o rw,remount /dev/block/mtdblock3 /system
で書き込めるようにしたあとで
#cp /data/hello         /system/bin/
これでフルパスで書かなくてもOK

android用のaptでもだれか書いてくれないかな。