node for Android
這週本來預定的目標是串接上NativeActivity, 不過, 沒做到, 需要多花點時間想切入點:- pass "struct android_app *" to Node (從android_main呼叫新的node::Start)
- wrap "struct android_app *" (是否要依附在process object? 參考資料: node_object_wrap.h, v8::Object::SetPointerInInternalField)
- Design of callbacks for AppCmd, InputEvent (NativeActivity --> Node)
adding native module to Node:
為了練習這部份, 把android log的機制加進去, 完成後可以在js裡用下面這樣叫用Android log
require('android');由這code看, 主要有兩個部分, 一個是一個名為android的module, 一個是alog這個global object (Node本身已有"log", 為避免衝突, 改名為alog)
alog.d('tag', 'message1'); //debug log
alog.e('tag', 'var a=', a, ' found', 1, 'error'); //error log
新增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
 
沒有留言:
張貼留言