[筆記] 2012 9月第一週

Reading time ~3 minutes

這禮拜想到的東西真有點雜, 標題只好隨便下, 本來這週給自己要求的進度應該要再多一點, 結果最後只為了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