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
沒有留言:
張貼留言