拥抱Android:编译nodejs搭建移动平台

有了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)

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,怎么办?随便找个代替吧,我直接把苹果官网的拽过来了:。建个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_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 handlerioctl(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:编译nodejs搭建移动平台

相关文章:

你感兴趣的文章:

标签云: