More Related Content
PDF
PDF
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法 PDF
An Internal of LINQ to Objects PDF
PDF
PDF
PDF
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る PPTX
RuntimeUnitTestToolkit for Unity What's hot
PDF
第三回ありえる社内勉強会 「いわががのLombok」 PDF
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する PDF
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC PPTX
C# 7.2 with .NET Core 2.1 PDF
Hello Dark-Side C# (Part. 1) PPTX
PDF
PDF
PPTX
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する PDF
映画にでてくるハッカーになりたい - YAPC Asia 2010 PPTX
PDF
js-ctypes - ネイティブコードを呼び出す新しいカタチ PDF
PPTX
13016 n分で作るtype scriptでnodejs PDF
Swift 2.0 大域関数の行方から #swift2symposium PDF
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京 PDF
PDF
Swift 2.0 で変わったところ「後編」 #cswift PDF
可変値変数 var を極力避けることを模索するための事前知識 #cswift Similar to Node native ext
PDF
PDF
わんくま同盟大阪勉強会 Vol.68 - Visual Studio Code 拡張機能作成入門 PPTX
PDF
TypeScript製フレームワーク「Nest」のご紹介 PDF
PPTX
node-gypを使ったネイティブモジュールの作成 ODP
PPTX
React NativeでTwitterクライアントを作ってみよう PDF
PPTX
[CB16] Electron - Build cross platform desktop XSS, it’s easier than you thin... PDF
PPTX
Hokuriku.net 2013 01-26 node.js PPTX
PDF
Node.js Tutorial at Hiroshima PDF
JavaScript Tips 2015(PDF 版) PPTX
PDF
PDF
PDF
PPTX
Javascriptのデザインパターン【勉強会資料】 More from 裕士 常田
PPTX
Openthread / nrf52811 調査(仮) PPTX
Arduino library の作り方 2020 PDF
PPTX
PPTX
いまどきの組込みOSの ZephyrRTOSと OpenThreadを Arduino環境で遊んでみる ODP
DVB recording command on gstreamer. PPTX
BlackMagic ProbeでARMをデバッグする PDF
Arduino compatible layer (with 6LoWPAN) on Contiki PPTX
PDF
PPTX
Node native ext
- 1.
- 2.
- 3.
- 4.
SWIG
Ruby, Python,Javaなんかで使われる、ネイティブ拡張生成のシステム。
独自のインターフェース定義言語から、自動的にGlueCodeを作る。
わりかしいい具合にやってくれるが、複雑なのはやっぱりしんどい。
JavaScriptはコールバック関数に対応していないなど、まだイマイチ
- 5.
- 6.
- 7.
C言語との接続の設計
簡単な例
constchar* hello() { return “hello”; }
これなら、だいたいの言語で文字列をマッピングする機能がある。
Napi::String Function(const Napi::CallbackInfo& info) {
Napi::Env env = info.Env();
return Napi::String::New(env, hello() );
}
Napi::Object Init(Napi::Env env, Napi::Object exports) {
exports.Set(Napi::String::New(env, “function"),
Napi::Function::New(env, Function));
return exports;
}
Node.js側にhello()をラップした関数オブジェクトを渡すことで、Node.jsからラッパ関数を呼べる。
ラッパ経由でhello()を呼べる
- 8.
Node.jsから呼ぶ
var addon= require('native-extension');
console.log(addon.function());
function() Function() hello()
- 9.
- 10.
- 11.
Node.jsから呼び出す
var obj= new addon.MyObject();
console.log( obj.plusOne() );
new
MyObject()
Constructor
obj.
plusOne()
PlusOne()
- 12.
- 13.
- 14.
Node.jsから呼び出す
var addon= require('native-extension');
console.log(addon.function_ext());
function_ext() FunctionExt
External mem
Externalは単なるプレースホルダ 中身はみせられない
- 15.
困るやつ(ネストされたclass,struct)
struct inner_t{int x; int y}
struct outer_t { struct inner_t inner_x; int z; }
Int func(struct inner_t* sx) {…}
struct Outer の中身のstruct Innerを取り出して使うパターン。
ラッパオブジェクト Inner のコンストラクタを呼べるようにしておく。
Externalでやると、中身が操作できないので困る。
- 16.
Napi::Function Inner::GetClass(Napi::Envenv) {
Napi::Function func = DefineClass(…);
constructor = Napi::Persistent(func);
constructor.SuppressDestruct();
}
Napi::Object Outer::get_inner_x(…) {
return Inner::constructor.new({});
}
Outerのラッパでinner_xを参照したときに、Innerのラッパオブジェクトを作
る。
- 17.
var obj= new addon.MyObject();
console.log( obj.plusOne() );
new
MyObject()
Outer
obj.
Inner
get_inner
Inner.x Inner::get_x
Inner
Constructor
- 18.
- 19.
- 20.
var obj= new addon.MyObject();
console.log( obj.inner );
console.log( new Inner() );
new
MyObject()
Constructor
obj.
Inner
get_inner
Inner
Constructor
New
Inner()
Inner
Constructor
- 21.
多分これでいいはず…?
//コンストラクタの引数ありなしでメモリを使い分ける
Inner::Inner(constNapi::CallbackInfo& info) : ObjectWrap(info)
{
if (info.Length() == 0) {
/* 自力で作るパターン。自前でメモリ*/
m_shptr = make_shared<struct inner_t>();
}
else if (info.Length() == 1 && info[0].IsExternal() ) {
/* 外からもらったshared_ptrを弱参照する (使わなくなったら消える)。*/
m_shptr = info[0].As<Napi::External< shared _ptr<struct inner_t> >();
}
else { /* 例外 */ }
}
- 22.
var non_deletable_inner= obj.inner_x; //objがいる限り中身は消さない
var deletable_x = new Inner(); // gcする
ネイティブ内部でもうまくライフサイクルの管理が必要
だいたいC++のshared_ptrでいけるはず。