拥抱Android:编译nodejs搭建移动平台
2014-12-08 22:05
531 查看
Android编译系列篇:
1 -
Python
2 - NodeJS
3 -
Nginx
4 - MariaDB
有了python,可是感觉库不全,于是就想想,要不编译下nodejs?
虽然github上已经有人编译了,(https://github.com/InstantWebP2P/node-android)可是用的是Rhino JS engine,我想要v8的…
下面就和大家一起进入nodejs的Android编译。
(编译脚本整理在github: https://github.com/dna2github/dna2oslab/tree/master/android/build 可以找到node-v0.12.6和node-v4.1.1)
![](http://img.blog.csdn.net/20141208220332873?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJvZ182MTAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
Android 运行nodejs
![](http://img.blog.csdn.net/20141208220430297?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJvZ182MTAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
NPM安装Grunt
nodejs的关联三方库很到位,下载nodejs的source,c-ares,v8,openssl和zlib都包含了,很开心。
这里先列出注意事项:
第一个要说的是./configure的时候一定要加--without-snapshot,不然之后snapshot生成还是很麻烦的。我的教训是开始没有加这个参数,直接把Makefile里的snapshot部分注释掉,结果编译出来的nodejs在Android上segment fault了。
Android的network头不全,所以编译当头棒就是nameser_compat.h,怎么办?随便找个代替吧,我直接把苹果官网的拽过来了:http://www.opensource.apple.com/source/Libc/Libc-825.40.1/include/arpa/nameser_compat.h。建个arpa文件夹一起放到cares的include里,然后可以顺利编译完c-ares。
下面就是libuv,里面的uv_barrier_t比较乱,一直报pthread_barrier_t找不到,看看Android libc.so和libc.a,确实pthread没有把pthread barrier一簇函数类型编进去。当时第一反应就是自己写一个,写完了发现nodejs竟然自己已经实现了,但是包裹在另一个次元(就是如果定义了__APPLE__宏才会包含)。所以这里要选择性的去掉#if,把uv_barrier_t以及相关的init, wait, destroy全部编译出来(修改deps/uv/src/unix/thread.c,
deps/uv/include/uv-unix.h)。
后面就是uv__recvmmsg和uv__utimesat在deps/uv/src/unix/linux-syscalls.c和.h里重复定义了,把.h里的干掉就好了。
接着把src/node.cc里和uid与gid相关的函数全部干掉,比如getpwuid,直接返回NULL之类就好了。之前还有些小break,比如IOV_MAX直接改1024啦什么的,编译的时候一点一点改,都不是问题。
最后就是比较变态的获得网络interface,一开始看看,觉得直接返回ENOENT,不实现好了,结果编译出来nodejs不能用npm下载包。好吧android里又没有ifaddrs.h,怎么办呢?突然想到了busybox,里面的ifconfig是工作的,在Android上也是,就把busybox-1.21.1/networking/interface.c拿出来改改,好了npm最后也工作了。
J.Y.Liu
2014.12.08
1 -
Python
2 - NodeJS
3 -
Nginx
4 - MariaDB
有了python,可是感觉库不全,于是就想想,要不编译下nodejs?
虽然github上已经有人编译了,(https://github.com/InstantWebP2P/node-android)可是用的是Rhino JS engine,我想要v8的…
下面就和大家一起进入nodejs的Android编译。
(编译脚本整理在github: https://github.com/dna2github/dna2oslab/tree/master/android/build 可以找到node-v0.12.6和node-v4.1.1)
Android 运行nodejs
NPM安装Grunt
nodejs的关联三方库很到位,下载nodejs的source,c-ares,v8,openssl和zlib都包含了,很开心。
这里先列出注意事项:
第一个要说的是./configure的时候一定要加--without-snapshot,不然之后snapshot生成还是很麻烦的。我的教训是开始没有加这个参数,直接把Makefile里的snapshot部分注释掉,结果编译出来的nodejs在Android上segment fault了。
Android的network头不全,所以编译当头棒就是nameser_compat.h,怎么办?随便找个代替吧,我直接把苹果官网的拽过来了:http://www.opensource.apple.com/source/Libc/Libc-825.40.1/include/arpa/nameser_compat.h。建个arpa文件夹一起放到cares的include里,然后可以顺利编译完c-ares。
下面就是libuv,里面的uv_barrier_t比较乱,一直报pthread_barrier_t找不到,看看Android libc.so和libc.a,确实pthread没有把pthread barrier一簇函数类型编进去。当时第一反应就是自己写一个,写完了发现nodejs竟然自己已经实现了,但是包裹在另一个次元(就是如果定义了__APPLE__宏才会包含)。所以这里要选择性的去掉#if,把uv_barrier_t以及相关的init, wait, destroy全部编译出来(修改deps/uv/src/unix/thread.c,
deps/uv/include/uv-unix.h)。
后面就是uv__recvmmsg和uv__utimesat在deps/uv/src/unix/linux-syscalls.c和.h里重复定义了,把.h里的干掉就好了。
接着把src/node.cc里和uid与gid相关的函数全部干掉,比如getpwuid,直接返回NULL之类就好了。之前还有些小break,比如IOV_MAX直接改1024啦什么的,编译的时候一点一点改,都不是问题。
最后就是比较变态的获得网络interface,一开始看看,觉得直接返回ENOENT,不实现好了,结果编译出来nodejs不能用npm下载包。好吧android里又没有ifaddrs.h,怎么办呢?突然想到了busybox,里面的ifconfig是工作的,在Android上也是,就把busybox-1.21.1/networking/interface.c拿出来改改,好了npm最后也工作了。
uv_err_t uv_interface_addresses(uv_interface_address_t** addresses, int* count) { int numreqs = 30; struct ifconf ifc; struct ifreq *ifr; int n, err = -1; int skfd; uv_interface_address_t *address; ifc.ifc_buf = NULL; skfd = socket(AF_INET, SOCK_DGRAM, 0); if (skfd < 0) { return uv__new_sys_error(-1); } for (;;) { ifc.ifc_len = sizeof(struct ifreq) * numreqs; ifc.ifc_buf = realloc(ifc.ifc_buf, ifc.ifc_len); if (ioctl(skfd, 0x8912 /*SIOCGIFCONF*/, &ifc) < 0) { goto out; } if (ifc.ifc_len == (int)(sizeof(struct ifreq) * numreqs)) { /* assume it overflowed and try again */ numreqs += 10; continue; } break; } *count = ifc.ifc_len/sizeof(struct ifreq); *addresses = (uv_interface_address_t*) malloc(*count * sizeof(uv_interface_address_t)); if (!(*addresses)) { return uv__new_artificial_error(UV_ENOMEM); } address = *addresses; ifr = ifc.ifc_req; for (n = 0; n < ifc.ifc_len; n += sizeof(struct ifreq)) { // XXX: add exception handler ioctl(skfd, 0x8915 /*SIOCGIFADDR*/, &ifr); address->name = strdup(ifr->ifr_name); if (ifr->ifr_addr.sa_family == AF_INET6) { address->address.address6 = *((struct sockaddr_in6 *)&ifr->ifr_addr); } else { address->address.address4 = *((struct sockaddr_in *)&ifr->ifr_addr); } ifr++; address++; } err = 0; out: close(skfd); free(ifc.ifc_buf); if (err == 0) return uv_ok_; return uv__new_sys_error(err); }
J.Y.Liu
2014.12.08
相关文章推荐
- 拥抱Android:编译nginx搭建移动平台
- 拥抱Android:编译python搭建移动的无线服务器平台
- 拥抱Android:编译python搭建移动的无线服务器平台
- Unity3D的Android移动之路之平台依赖编译
- 深入浅出 - Android系统移植与平台开发(四)- 搭建Linux编译环境
- 高通平台android环境搭建,编译,系统引导流程分析
- 搭建opencv的android编译平台出现的问题
- ubantu搭建android编译平台
- android平台自动化编译环境搭建一hudson安装
- android源码编译平台环境搭建
- MSD6A801 android4.2.1 full_mstarkaisers_dvbt-userdebug编译平台搭建-编译-OTA升级
- ubuntu 下基于源码的android平台搭建与内核编译
- Unity3D的Android移动之路之平台依赖编译
- 关于cocos2d-x 3.X的搭建和编译成Android平台程序的说明
- Cocos2dx3.10在Windows平台搭建Android命令行编译apk打包
- android编译环境的搭建和编译(全志A20平台)
- 深入浅出 - Android系统移植与平台开发(四)- 搭建Linux编译环境
- Ogrekit源码Windows平台编译_Android环境搭建