« Android MPEG-2 benchmarks | Home | libmedia source code in Android 4.1 Jellybean »
Compiling GNU Nano for Android
By admin | July 13, 2012
If you just want a pre-built, ready to use version of Nano for Android, you can get the pre-built version.
The results of these steps include:
- GNU Nano 2.2.6 with statically-linked libncurses
- Compatibility with ≥ Android 2.1
- A working enter key, in adb shell and Term.apk
- A terminfo package
# Export toolchain for build export ANDROID_NDK=/opt/android-ndk-r8 export CC="$ANDROID_NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc --sysroot=/opt/android-ndk-r8/platforms/android-5/arch-arm" export CXX="ANDROID_NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-g++ --sysroot=/opt/android-ndk-r8/platforms/android-5/arch-arm" # Build ncurses static lib wget ftp://ftp.gnu.org/pub/gnu/ncurses/ncurses-5.9.tar.gz -O- | tar zxvf - cd ncurses-5.9/ # ../form/fty_num.c:226: error: 'struct lconv' has no member named 'decimal_point' # fty_num.c:(.text+0x280): undefined reference to `localeconv' patch -p0 << NcursesPatch --- form/fty_num.c 2012-07-13 23:04:53.914039027 -0400 +++ form/fty_num.c 2012-07-13 23:05:38.057484067 -0400 @@ -36,6 +36,12 @@ MODULE_ID("$Id: fty_num.c,v 1.28 2010/01/23 21:14:36 tom Exp $") +/* "MISSING FROM BIONIC - DEFINED TO MAKE libstdc++-v3 happy" */ +#ifdef HAVE_LOCALE_H +# undef HAVE_LOCALE_H +# define HAVE_LOCALE_H 0 +#endif + #if HAVE_LOCALE_H #include <locale.h> #endif NcursesPatch ./configure --with-normal --without-shared --without-cxx-binding --enable-root-environ --disable-widec --without-tests --host=arm-linux make -j3 # Nano 2.2.6 build cd .. wget http://www.nano-editor.org/dist/v2.2/nano-2.2.6.tar.gz -O- | tar zxvf - cd nano-2.2.6/ # Patch to get around bionic deficiencies patch -p0 << NanoAndroid --- src/chars.c 2012-07-13 22:02:21.741210225 -0400 +++ src/chars.c 2012-07-13 22:04:02.887938640 -0400 @@ -79,6 +79,7 @@ return ((unsigned int)c == (unsigned char)c); } +/* static void mbtowc_reset(void) { IGNORE_CALL_RESULT(mbtowc(NULL, NULL, 0)); @@ -88,6 +89,7 @@ { IGNORE_CALL_RESULT(wctomb(NULL, 0)); } +*/ /* This function is equivalent to isalnum() for multibyte characters. */ bool is_alnum_mbchar(const char *c) --- src/files.c 2012-07-13 22:13:35.516739719 -0400 +++ src/files.c 2012-07-13 22:13:38.796698486 -0400 @@ -2237,13 +2237,16 @@ tilde_dir = mallocstrncpy(NULL, buf, i + 1); tilde_dir[i] = '\0'; + /* do { userdata = getpwent(); } while (userdata != NULL && strcmp(userdata->pw_name, tilde_dir + 1) != 0); endpwent(); - if (userdata != NULL) - tilde_dir = mallocstrcpy(tilde_dir, userdata->pw_dir); + */ + char* home = getenv("HOME"); + if (home != NULL) + tilde_dir = mallocstrcpy(tilde_dir, home); } retval = charalloc(strlen(tilde_dir) + strlen(buf + i) + 1); @@ -2340,7 +2343,7 @@ assert(buf != NULL && num_matches != NULL && buf_len > 0); *num_matches = 0; - +#if 0 while ((userdata = getpwent()) != NULL) { if (strncmp(userdata->pw_name, buf + 1, buf_len - 1) == 0) { /* Cool, found a match. Add it to the list. This makes a @@ -2362,7 +2365,7 @@ } } endpwent(); - +#endif return matches; } --- src/nano.c 2012-07-13 22:49:46.001453034 -0400 +++ src/nano.c 2012-07-13 22:51:23.860222781 -0400 @@ -1534,6 +1534,12 @@ } #endif + /* Workaround for enter key */ + /* https://github.com/Evervolv/android_external_nano/commit/7b568f0b417c1fe3fe8597c600bdbcda4837013f */ + if (input == 10) { + input = NANO_CONTROL_M; + } + /* Check for a shortcut in the main list. */ s = get_shortcut(MMAIN, &input, meta_key, func_key); --- src/prompt.c.old 2012-07-13 22:51:47.839921315 -0400 +++ src/prompt.c 2012-07-13 22:51:49.615898989 -0400 @@ -87,6 +87,10 @@ } #endif + if (input == 10) { + input = NANO_CONTROL_M; + } + /* Check for a shortcut in the current list. */ s = get_shortcut(currmenu, &input, meta_key, func_key); NanoAndroid ./configure --disable-rpath --disable-nls --host=arm-linux --disable-color --disable-utf8 --disable-browser CFLAGS="-I$PWD/../ncurses-5.9/include" LIBS="$PWD/../ncurses-5.9/lib/libncurses.a" LDFLAGS="-L$PWD/../ncurses-5.9/lib" make -j3 # Create a terminfo package (skip if you already have one) tar cvf terminfo.tar -C /lib terminfo/ adb push terminfo.tar /data/local/tmp # deploy to phone adb push ./src/nano /data/local/tmp adb shell # On Android phone now: cd /data/local/tmp tar xf terminfo.tar # skip if you did not do "create a terminfo package" above export TERMINFO=./terminfo # or wherever your terminfo is # Run nano on Android phone ./nano # If you get an error like Error opening terminal: vt100. # It means that you did not do the TERMINFO thing properly.
If you found this article helpful or interesting, please help Compdigitec spread the word. Don’t forget to subscribe to Compdigitec Labs for more useful and interesting articles!
Topics: Mobile | 7 Comments »
July 20th, 2012 at 11:37
any chance you will be able to type in “gcc” in the foreseeable future?
July 31st, 2012 at 08:37
In order to use Nano via SSHDroid it was important to extract the contents of “terminfo.tar” and place into “/etc/terminfo” 😉
May 7th, 2016 at 06:11
[…] まずはncursesが必要なので、ncursesをビルドすることにする。 ビルドするにあたっては下記サイトを参考にした。 Compiling GNU Nano for Android at Compdigitec Labs […]
January 25th, 2025 at 10:12
… [Trackback]
[…] There you can find 57332 additional Info to that Topic: compdigitec.com/labs/2012/07/13/compiling-gnu-nano-for-android/ […]
January 25th, 2025 at 11:02
… [Trackback]
[…] Read More on on that Topic: compdigitec.com/labs/2012/07/13/compiling-gnu-nano-for-android/ […]
February 5th, 2025 at 00:53
… [Trackback]
[…] Find More Information here on that Topic: compdigitec.com/labs/2012/07/13/compiling-gnu-nano-for-android/ […]
February 11th, 2025 at 22:25
… [Trackback]
[…] Read More on to that Topic: compdigitec.com/labs/2012/07/13/compiling-gnu-nano-for-android/ […]