2012年9月2日 星期日

[筆記] 2012 9月第一週

這禮拜想到的東西真有點雜, 標題只好隨便下, 本來這週給自己要求的進度應該要再多一點, 結果最後只為了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://nodejs.org/api/addons.html#addons_hello_world , 不過, 這邊加的不是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: https://github.com/julianshen/node-android/blob/master/jni/node-v0.8.8/android/node_android.cc
不過這樣不夠, 因為我要的不是只有"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做啥好