這禮拜想到的東西真有點雜, 標題只好隨便下, 本來這週給自己要求的進度應該要再多一點, 結果最後只為了node for Android加了Android log的機制

node for Android

這週本來預定的目標是串接上NativeActivity, 不過, 沒做到, 需要多花點時間想切入點:
  1. pass “struct android_app *” to Node (從android_main呼叫新的node::Start)
  2. wrap “struct android_app *” (是否要依附在process object? 參考資料: node_object_wrap.h, v8::Object::SetPointerInInternalField)
  3. Design of callbacks for AppCmd, InputEvent (NativeActivity –> Node)
這邊有點頭痛, 要找到一個比較好的切入點設計一個新的架構給NativeActivity, 不過這邊又回頭想了一個問題, 到底Node適不適合UI programming, 還是當做一個server, 掛到一個Android service會比較適合?

adding native module to Node:
為了練習這部份, 把android log的機制加進去, 完成後可以在js裡用下面這樣叫用Android log
require(‘android’);
alog.d('tag’, 'message1’); //debug log
alog.e('tag’, 'var a=’, a, ’ found’, 1, 'error’); //error log
由這code看, 主要有兩個部分, 一個是一個名為android的module, 一個是alog這個global object (Node本身已有"log", 為避免衝突, 改名為alog)

新增module的參考資料為: http://bit.ly/RzIQWl , 不過, 這邊加的不是addon而是一個native module, 所以有點不同, 首先為了這個module新增了, node_android.cc (class Android), 名字一定要是"node_“開頭 , 這是由於binding時, 會尋找"node_"開頭的module (參考 node_extensions.cc : get_builtin_module), 這邊主要implement的是用"NODE_SET_METHOD"加入新的method "log”, 用"NODE_DEFINE_CONSTANT"映射了幾個log level的常數, 最後用"NODE_MODULE"定義module的init method
Source code: http://bit.ly/RzIOxD
不過這樣不夠, 因為我要的不是只有"log", 而是要像"alog.d"這樣的東西, 因此又多了一個android.js來處理:

 


var binding = process.binding('android');





function log(level, args) {


    var tag = args[0];


    var len = args.length;


    var objs = [];





    for(var i = 1; i < len; i++) {


       objs.push(args[i]);


    }


    var msg = objs.join(' ');





    binding.log(level, tag, msg);


}





var alog = {


    v: function() {


        log(binding.ANDROID_LOG_VERBOSE, arguments);


    },


    d: function() {


        log(binding.ANDROID_LOG_DEBUG, arguments);


    },


    i: function() {


        log(binding.ANDROID_LOG_INFO, arguments);


    },


    w: function() {


        log(binding.ANDROID_LOG_WARN, arguments);


    },


    e: function() {


        log(binding.ANDROID_LOG_ERROR, arguments);


    }


};





global.alog = alog;




首先用了process.binding來bind剛剛native的部份, 另為就是把alog變成global object


其他TODO

Idea board, Bluetooth OPP….還沒想fb world hack做啥好


via Blogger http://bit.ly/RzIOxF

昨天晚上,突然開始在想一件事,怎樣把一堆ideas變成一些有用的東西?有些人有想法但力有未逮,有些人則有能力,用一個東西把這些串一起實現一些酷玩意兒,或許不錯 XD

 



via Blogger http://bit.ly/T3mle0

這是我給自己練習NDK的作業,選擇node.js的原因是, 沒啥, 就只是覺得應該會蠻好玩的, 之前就有念頭想po, 加上node.js所需要的像是openssl, v8等等, 在Android上早就有了, 想說porting應該也不會有太大的困難吧, 應該也不用改太多code才對

實際是,還是有點問題, 需要改些東西, ndk的build system可以說是原本Android的簡化版, 所以有些東西並沒有, 所以並不是把原本的Android.mk copy過來就沒問題了, 比如說v8, LOCAL_GENERATED_SOURCES, intermediates 這些東西雖然有在原本aosp的build system內, 但在NDK就完全不存在, 但由於v8和node都有需要把js lib轉成CPP一起build進去, 所以這時候就要借助這類的東西:
$(shell python $(JS2C_PY) $(GEN1) CORE off $(LOCAL_JS_LIBRARY_FILES))

起初我並沒注意到js2c這部份, 結果最後link不過, 缺了一堆東西, trace之後才發現少這部份

此外, 在uv的部份, 由於uv是node的native library的部份, 有一些OS相關的code, 但由於Andorid的bionic比起libc是算簡化版本, 有些API並不存在, 因此除了為android產生一些專屬的config.h (我從linux的版本去改的), 還要改一些code

目前的進度是, 可以用ndk-r8b build出Android可用的可執行檔(還沒完全測過, 應該有些bug代解), 先全用static link的

Source codes放在GitHub : http://bit.ly/ODaijv

還有一些想做的還沒做:

  1. 接上NativeActivity
  2. OpenGL ES api
  3. 其他?


via Blogger http://bit.ly/ODaijB

My personal blog will move to Blogger from now on due to Posterous is aquired by Twitter. I like Posterous but it might be end of life someday. Moving to Blogger might be a better decesion.

我之前會選擇Posterous的原因是它的介面還算好用, 而且可以e-mail post以及轉貼到各個不同的地方去, 不過現在既然它被Twitter給併購了, 隨時也有可能不見, 所以只好撤回Blogger去了, 本考慮Blogger或是Tumblr, Tumblr也一樣簡單, 只是想說投靠Google還是比較保險, 未來在Posterous這邊我就不會再張貼新文章了

我家裡的電腦是Mac mini, OS是Mac OS Lion, 如果照著ADK2012的開發文件想要去設定環境來開發, 一開始就會碰壁了

在文件中寫著, 你可以從"repo init -u https://android.googlesource.com/accessories/manifest“下載原始碼, 或是下載Mac版的ADK 2012 IDE (應該是由Arduino IDE改的)來開始開發

但不管是IDE也好, 還是照著command line的步驟來做, 都會得到無法在找到/dev/ttyUSB0的錯誤(在IDE裡面也根本看不到這個), 剛用估狗大神查了一下, 有人討論, 但也沒有答案, 最後是在ADK2011的文件裡找到解答, 差的就是FTDI USB Driver, 其實照它講的位置也沒找到mac版本的driver, 只有windows版本的driver, mac版本的可以到FTDI chip的官網下載

裝完FTDI driver後, 打開IDE就可以看到USB serial的位置了

_2012-07-19_11
在我電腦的例子是/dev/tty.usbserial-AH015SE1

接下來如果到"android-accessories/adk2012/board/MakefileBasedBuild"去在重build一次並重燒, 這次會發現, 在做

$> ./flash

這步驟時還是會失敗, 這是因為在這script裡寫死了

UART=/dev/ttyUSB0

所以UART的位置不是這個就會有問題, 因此我改成下列的方式燒

$> android-accessories/ADK2012.app/Contents/Resources/Java/hardware/tools/adk2tool /dev/tty.usbserial-AH015SE1 erase

$> android-accessories/ADK2012.app/Contents/Resources/Java/hardware/tools/bossac –port=tty.usbserial-AH015SE1 -w -b app/bin/test_sam3x_ek_sam3x8-flash.bin

$> android-accessories/ADK2012.app/Contents/Resources/Java/hardware/tools/adk2tool /dev/tty.usbserial-AH015SE1 reset

要照這順序執行, 一開始我不小心erase掉了後, 燒不成功(因為bossac少加了 –port), 整台黑漆漆的不動, 嚇了我一身汗, 以為把它搞掛了… :P

好吧, 可以開始亂改看看了