ラベル NDK の投稿を表示しています。 すべての投稿を表示
ラベル NDK の投稿を表示しています。 すべての投稿を表示

2013/05/18

Android用のnkfをコンパイル その2

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

久々にnkfのページを見たら2013/04/28にlanginfo.hが無い環境でもコンパイルが出来るようになってました。(バージョン2.1.2の時は少し修正が必要)


たまに、「Android nkf」で検索してくる方がいるので、コンパイルしたものをおいておきます。
http://ux.getuploader.com/zau2and/

ソースはrev.1380c60f4dc910d197c2697796a875bf9e2693d9のを使用し、config.hでデフォルトの出力コードをUTF-8にしています。
Android NDK Revision 8e を使って、Android2.3(ARM)向けにコンパイルしています。(2.3.4, 4.0.4, 4.2.2で動作確認済み)

2012/05/19

WgetをAndroid NDKでコンパイル

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

configureを使用してからmakeするソフトウェアをAndroid用にコンパイルできればなぁ、と。
間違っているところもあると思いますので注意してください。

こんな流れで作成してみる。

  • configureでコンパイル時に必要なファイル等を作成
  • Makefileと実際にmakeして、コンパイル対象となるソースやコンパイル時の定義を確認し、Android.mkを作成。(makeで作成されるバイナリでもAndroidで動くのですが、ndk-buildで作成したいので)
  • ndk-buildでAndroid用のバイナリを作成

Android用のWgetは既にバイナリが提供されているので(Android用のwgetを導入参照)、無駄に思えるけど、Wget(1.11.4)がコンパイルしやすかったので、NDK内のドキュメントSTANDALONE-TOOLCHAIN.htmlを読みながらコンパイルしてみる。
(CentOS 5.8上のAndroid NDK Revision 8で実行しています)

1.toolchainの選択
 使っているAndroidのCPUがARMなのでarm-linux-androideabi-4.4.3になる。
2.sysrootの設定
 NDKを$HOMEに展開しているので
$ NDK=${HOME}/android-ndk-r8
 とし、Android 2.3向けにコンパイルしたいので
$ SYSROOT=${NDK}/platforms/android-9/arch-arm
 とする。AndroidのバージョンとAPIレベルの対応はSTABLE-APIS.htmlを参照。
3.コンパイラの選択
$ export CC="${NDK}/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc --sysroot=${SYSROOT}"
 CCに--sysrootまでを含める。
4.CFLAGSの設定
 CPUがAMRv7でVFPがあるのでドキュメントと同じ様に設定。ただし、この後に実行するconfigureでCFLAGSが反映されないのでexportしておく。
$ export CFLAGS='-march=armv7-a -mfloat-abi=softfp'

ここからドキュメントを離れて実際にconfigureとmake
$ tar zxf wget-1.11.4.tar.gz
$ cd wget-1.11.4
$ ./configure --without-ssl --disable-nls --build=i686-pc-linux --host=arm-none-linux-gnueabi
config.status: WARNING:  Makefile.in seems to ignore the --datarootdir setting
※2013/05/20 追記: configure時のオプション--hostはgccの前に付いているarm-linux-androideabiのほうがいいですね。

と警告が出るが、コンパイルしたいだけなので気にしない。
コンパイル時に必要なsrc/config.hが作成されるのでsrcディレクトリに移動してmake。
$ cd src
$ make
utils.c: In function 'get_grouping_data':
utils.c:1223: error: 'struct lconv' has no member named 'thousands_sep'
utils.c:1224: error: 'struct lconv' has no member named 'grouping'
utils.c:1238: error: 'struct lconv' has no member named 'decimal_point'
make: *** [utils.o] エラー 1
utils.cでエラーとなる。Android NDKのlocale.hではstruct lconvが定義されているがメンバーが無いので修正する。

--- utils.c.org 2008-04-27 13:48:24.000000000 +0900
+++ utils.c     2012-05-19 18:04:08.000000000 +0900
@@ -1213,6 +1213,10 @@
 static void
 get_grouping_data (const char **sep, const char **grouping)
 {
+#ifdef __ANDROID__
+  static const char *cached_sep = ",";
+  static const char *cached_grouping = "\x03";
+#else
   static const char *cached_sep;
   static const char *cached_grouping;
   static bool initialized;
@@ -1243,6 +1247,7 @@
         }
       initialized = true;
     }
+#endif
   *sep = cached_sep;
   *grouping = cached_grouping;
 }
変な直し方ですが、数値の桁区切りの文字と区切りを入れる桁数の設定をしているだけなので、こんな感じで。
utils.cの1箇所からしか呼ばれていないので、get_grouping_data()の呼び出し元を修正してget_grouping_data()を削除してもいいかも。
修正後、makeしなおしてwgetが作成されることを確認。

Android.mkとApplication.mkをwget-1.11.4/jni/に作成して、ndk-buildでもwgetが作成できることを確認。

以前Android用のwgetを導入した時は、修正パッチを見て結構修正する必要があると思ったのですが、Android向けの設定でconfigureが通れば、修正箇所はかなり減りますね。

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/05/23

Androidのターミナルでsl

歌代氏が、sl-jslinux - hatena.utashiro.comでjslinux向けにslを動く用に修正されたソースを公開されていた。
vt100 環境限定となっている。Androidのターミナルでも動くかも。
Android NDKの環境構築も兼ねて、コンパイルしてみる。

まずAndroid NDK | Android Developersから、Linuxでコンパイルするのでandroid-ndk-r5b-linux-x86.tar.bz2をダウンロード。
ダウンロードしたファイルをホームディレクトリで展開。

コンパイル用にディレクトリ(~/sl/jni/)を作成。

slコマンドのソースの
 #include <tcclib.h>
となっている行を
 #include <stdio.h>
に修正し、sl.cとして~/sl/jni/に保存。

~/sl/jni/Android.mk を以下の内容で作成。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := sl
LOCAL_SRC_FILES := sl.c
include $(BUILD_EXECUTABLE)
~/sl/jni/に移動してコンパイル。

$ ~/android-ndk-r5b/ndk-build
と入力すると
Compile thumb  : sl <= sl.c
Executable     : sl
Install        : sl => libs/armeabi/sl
と出力された。~/sl/libs/armeabi/に移動し、

$ file sl
と入力すると、
sl: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), stripped
と出力された。これをIS01に送って実行してみる。


slコマンドが動いた。