2012/02/19

Android上で動くgccの導入

2017/11/20 追記
Android 5.0以上ならTermuxでClangを使用できます → Termuxの備忘録
追記ここまで


前からAndroid上で動くgccが欲しいなぁと思っていたのですが、半年以上前にciel氏(@cielavenir)が作成されていました。凄い。

Marijuana氏のツイートを見て、同じくFDcloneをAndroid上で動かしたいな、と思っていたところ、ciel氏がFDcloneをビルドして下さったところから、Android上で動くgccがあることを知りました。

ciel氏のDropboxで共有されているファイルの一覧から以下のファイルをダウンロード。
  • android_gcc_r2a.tar.bz2
  • android_gcc_supplement.tar.bz2
adbでIS01に接続し、/data/local/に「gcc」ディレクトリを作成(パーミッションは775)後、2ファイルを展開。
/data/localのパーミッションが771なので、connect botで操作する時もファイルの一覧が見られるようにパーミッションを775に変更。

普段はconnect botでシェルをbashにしているので、~/.bashrcにgccなどへのパスの設定とライブラリのパスの設定を追加。

PATH=$PATH:/data/local/gcc/bin
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/local/gcc/lib
簡単なソースを書き、コンパイルして作成された実行ファイルが動くことを確認。


FDcloneの導入は、Marijuana氏のサイトrattcv氏のブログ(2012/02/17)を参考にして下さい。

IS01ではciel氏のビルドされたFDcloneだと
reloc_library[1302]: 9496 cannot locate 'killpg'...CANNOT LINK EXECUTABLE
となり、動作しなかったので、自分でビルドすることに。
#Android2.xと1.6の差か…

2012/05/19 追記
Android NDKのヘッダーファイルを見るとkillpg()がサポートされているのはAPIレベルが8以上、つまりAndroid 2.2以上のようです。

2012/02/11

Android用のnkfをコンパイル

2017/11/20 追記
Android 5.0以上ならTermuxでnkfをコンパイルして使用できます → Termuxの備忘録
追記ここまで

PerlのEncodeをAndroid用に作成するのは難しいので、nkfをコンパイルすることに。
#JIS, Shift JIS, EUC, UTF-8が扱えればOKなので。

nkfのソースを http://sourceforge.jp/projects/nkf/ から取得。
これを書いている時点での最新バージョンは2.1.2。

ダウンロードしたnkf-2.1.2.tar.gzからコンパイルに必要なファイル
config.h
nkf.c
nkf.h
utf8tbl.c
utf8tbl.h
の5ファイルを~/nkf/jni/ (ディレクトリは前もって作成)にコピー。
Android.mkの内容は、
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := nkf
LOCAL_SRC_FILES := nkf.c utf8tbl.c
include $(BUILD_EXECUTABLE)
で、コンパイル。
$ ~/android-ndk-r6/ndk-build
Compile thumb  : nkf <= nkf.c
In file included from /home/xxxxx/nkf/jni/nkf.c:30:
/home/xxxxx/nkf/jni/nkf.h:166:22: error: langinfo.h: No such file or directory
/home/xxxxx/nkf/jni/nkf.c: In function 'nkf_locale_charmap':
/home/xxxxx/nkf/jni/nkf.c:756: error: 'CODESET' undeclared (first use in this function)
/home/xxxxx/nkf/jni/nkf.c:756: error: (Each undeclared identifier is reported only once
/home/xxxxx/nkf/jni/nkf.c:756: error: for each function it appears in.)
make: *** [/home/xxxxx/nkf/obj/local/armeabi/objs/nkf/nkf.o] エラー 1
langinfo.hが無くてエラーとなっている。

KMC Staff Blog:RubyをAndroid用にビルドする を参考にnkf.hを修正。
$ diff -u nkf.h.org nkf.h

--- nkf.h.org   2011-09-08 21:02:30.000000000 +0900
+++ nkf.h       2012-02-10 23:44:10.000000000 +0900
@@ -153,6 +153,10 @@
 # ifndef HAVE_LOCALE_H
 #  define HAVE_LOCALE_H
 # endif
+#elif defined(__ANDROID__)
+# ifndef HAVE_LOCALE_H
+#  define HAVE_LOCALE_H
+# endif
 #else
 # ifndef HAVE_LANGINFO_H
 #  define HAVE_LANGINFO_H
でコンパイルし直し。

Compile thumb  : nkf <= nkf.c
Compile thumb  : nkf <= utf8tbl.c
Executable     : nkf
Install        : nkf => libs/armeabi/nkf
実機で動くことを確認。

2013/05/19追記: Android用のnkfをコンパイル その2 でコンパイルしたものを置いてます。

2011/07/18

Can't locate unicore/PVA.pl

SL4A + Perl でスクリプトを書いていじってたら、日本語(マルチバイト)があった部分で、
Can't locate unicore/PVA.pl in @INC (@INC contains: ~@INCのパス~) at /data/data/com.googlecode.perlforandroid/files/perl/5.10.0/utf8_heavy.pl line 97, line xxx.
というメッセージが出力された。これはhide_o_55氏の
SL4AのPerl for Androidでマルチバイト文字を使う際に落ちる件
に書かれている手順でAndroid.pmのdo_rpc()を修正することで動くようになる。

しかし、日本語をファイルへ出力しようとすると、
Wide character in print at スクリプト名 line xxx, line yyy.
となり内部エンコードのまま出力されている。EncodeがあればいいのだがSL4A + Perl にはない。コンパイルするのも手間がかかりそう。
ということで、unicore/PVA.pl を用意してみる。

SL4AのPerlにはPVA.plを作成するのに必要なモジュールの一部がないので実行はLinux PCで。
SL4AのPerlのバージョンが5.11.0なので、http://www.cpan.org/src/5.0/からPerl 5.11.0のソースをダウンロードして展開。
cd perl-5.11.0/lib/unicore
perl ./mktables
cd ..
と実行してPVA.plが作成されたことを確認。このファイルだけあればOKというわけではないので、unicoreディレクトリをSDカード(/sdcard/com.googlecode.perlforandroid/extras/perl/site_perl/)にコピー。
これで今のところAndroid.pmのdo_rpc()を修正しなくても、うまく動いている模様。