Enviar pesquisa
Carregar
Node native ext
•
Transferir como PPTX, PDF
•
0 gostou
•
252 visualizações
裕士 常田
Seguir
node
Leia menos
Leia mais
Tecnologia
Vista de apresentação de diapositivos
Denunciar
Compartilhar
Vista de apresentação de diapositivos
Denunciar
Compartilhar
1 de 22
Baixar agora
Recomendados
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
Masahiro Wakame
RuntimeUnitTestToolkit for Unity
RuntimeUnitTestToolkit for Unity
Yoshifumi Kawai
OSS開発勉強会-03
OSS開発勉強会-03
Kohei KaiGai
ocsとselってコマンド作ったわよ
ocsとselってコマンド作ったわよ
xztaityozx
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
Yoshifumi Kawai
An Internal of LINQ to Objects
An Internal of LINQ to Objects
Yoshifumi Kawai
Unityで覚えるC#
Unityで覚えるC#
Masamitsu Ishikawa
プロトコル指向に想う世界観 #__swift__
プロトコル指向に想う世界観 #__swift__
Tomohiro Kumagai
Recomendados
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
Masahiro Wakame
RuntimeUnitTestToolkit for Unity
RuntimeUnitTestToolkit for Unity
Yoshifumi Kawai
OSS開発勉強会-03
OSS開発勉強会-03
Kohei KaiGai
ocsとselってコマンド作ったわよ
ocsとselってコマンド作ったわよ
xztaityozx
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
Yoshifumi Kawai
An Internal of LINQ to Objects
An Internal of LINQ to Objects
Yoshifumi Kawai
Unityで覚えるC#
Unityで覚えるC#
Masamitsu Ishikawa
プロトコル指向に想う世界観 #__swift__
プロトコル指向に想う世界観 #__swift__
Tomohiro Kumagai
映画にでてくるハッカーになりたい - YAPC Asia 2010
映画にでてくるハッカーになりたい - YAPC Asia 2010
Hiroh Satoh
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
hecomi
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
yoshiaki iwanaga
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
Unity Technologies Japan K.K.
たのしいNode.js
たのしいNode.js
ishiki-takai
Swift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswift
Tomohiro Kumagai
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
Yoshifumi Kawai
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
Takayoshi Tanaka
第2回鹿児島node.jsの会資料_内村
第2回鹿児島node.jsの会資料_内村
Koichi Uchimura
どこでも動くゲームを作るためのベタープラクティス
どこでも動くゲームを作るためのベタープラクティス
5mingame2
Swift 2.0 大域関数の行方から #swift2symposium
Swift 2.0 大域関数の行方から #swift2symposium
Tomohiro Kumagai
SEH on mingw32
SEH on mingw32
kikairoya
メタメタプログラミングRuby
メタメタプログラミングRuby
emasaka
LINQ in Unity
LINQ in Unity
Yoshifumi Kawai
C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1
信之 岩永
js-ctypes - ネイティブコードを呼び出す新しいカタチ
js-ctypes - ネイティブコードを呼び出す新しいカタチ
Makoto Kato
Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)
Yuto Takei
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
shigeki_ohtsu
可変値変数 var を極力避けることを模索するための事前知識 #cswift
可変値変数 var を極力避けることを模索するための事前知識 #cswift
Tomohiro Kumagai
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
Takuro Iizuka
Cookpad Summer Intern 2015 - Programming Paradigm
Cookpad Summer Intern 2015 - Programming Paradigm
Minero Aoki
Mais conteúdo relacionado
Mais procurados
映画にでてくるハッカーになりたい - YAPC Asia 2010
映画にでてくるハッカーになりたい - YAPC Asia 2010
Hiroh Satoh
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
hecomi
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
yoshiaki iwanaga
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
Unity Technologies Japan K.K.
たのしいNode.js
たのしいNode.js
ishiki-takai
Swift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswift
Tomohiro Kumagai
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
Yoshifumi Kawai
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
Takayoshi Tanaka
第2回鹿児島node.jsの会資料_内村
第2回鹿児島node.jsの会資料_内村
Koichi Uchimura
どこでも動くゲームを作るためのベタープラクティス
どこでも動くゲームを作るためのベタープラクティス
5mingame2
Swift 2.0 大域関数の行方から #swift2symposium
Swift 2.0 大域関数の行方から #swift2symposium
Tomohiro Kumagai
SEH on mingw32
SEH on mingw32
kikairoya
メタメタプログラミングRuby
メタメタプログラミングRuby
emasaka
LINQ in Unity
LINQ in Unity
Yoshifumi Kawai
C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1
信之 岩永
js-ctypes - ネイティブコードを呼び出す新しいカタチ
js-ctypes - ネイティブコードを呼び出す新しいカタチ
Makoto Kato
Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)
Yuto Takei
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
shigeki_ohtsu
可変値変数 var を極力避けることを模索するための事前知識 #cswift
可変値変数 var を極力避けることを模索するための事前知識 #cswift
Tomohiro Kumagai
Mais procurados
(20)
映画にでてくるハッカーになりたい - YAPC Asia 2010
映画にでてくるハッカーになりたい - YAPC Asia 2010
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
たのしいNode.js
たのしいNode.js
Swift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswift
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
第2回鹿児島node.jsの会資料_内村
第2回鹿児島node.jsの会資料_内村
どこでも動くゲームを作るためのベタープラクティス
どこでも動くゲームを作るためのベタープラクティス
Swift 2.0 大域関数の行方から #swift2symposium
Swift 2.0 大域関数の行方から #swift2symposium
SEH on mingw32
SEH on mingw32
メタメタプログラミングRuby
メタメタプログラミングRuby
LINQ in Unity
LINQ in Unity
C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1
js-ctypes - ネイティブコードを呼び出す新しいカタチ
js-ctypes - ネイティブコードを呼び出す新しいカタチ
Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
可変値変数 var を極力避けることを模索するための事前知識 #cswift
可変値変数 var を極力避けることを模索するための事前知識 #cswift
Semelhante a Node native ext
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
Takuro Iizuka
Cookpad Summer Intern 2015 - Programming Paradigm
Cookpad Summer Intern 2015 - Programming Paradigm
Minero Aoki
node+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作る
Kiyoshi SATOH
Hbstudy41 auto scaling
Hbstudy41 auto scaling
Fujishiro Takuya
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
mganeko
実践 NestJS
実践 NestJS
Ayumi Goto
ATN No.2 Scala事始め
ATN No.2 Scala事始め
AdvancedTechNight
Nodejuku01 ohtsu
Nodejuku01 ohtsu
Nanha Park
Clrh 110827 wfho
Clrh 110827 wfho
Tomoyuki Obi
スタート低レイヤー #0
スタート低レイヤー #0
Kiwamu Okabe
Hokuriku.net 2013 01-26 node.js
Hokuriku.net 2013 01-26 node.js
Tadahiro Ishisaka
GroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hack
Takahiro Yoshimura
ラズパイ2で動く Docker PaaSを作ってみたよ
ラズパイ2で動く Docker PaaSを作ってみたよ
npsg
Node.jsでブラウザメッセンジャー
Node.jsでブラウザメッセンジャー
Yahoo!デベロッパーネットワーク
Heliumエンジンの設計と実装
Heliumエンジンの設計と実装
DADA246
Lxc cf201207-presen
Lxc cf201207-presen
Kouhei Maeda
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
Hiroh Satoh
Rust-DPDK
Rust-DPDK
Masaru Oki
【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門
sandai
第2回勉強会スライド
第2回勉強会スライド
koturn 0;
Semelhante a Node native ext
(20)
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
Cookpad Summer Intern 2015 - Programming Paradigm
Cookpad Summer Intern 2015 - Programming Paradigm
node+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作る
Hbstudy41 auto scaling
Hbstudy41 auto scaling
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
実践 NestJS
実践 NestJS
ATN No.2 Scala事始め
ATN No.2 Scala事始め
Nodejuku01 ohtsu
Nodejuku01 ohtsu
Clrh 110827 wfho
Clrh 110827 wfho
スタート低レイヤー #0
スタート低レイヤー #0
Hokuriku.net 2013 01-26 node.js
Hokuriku.net 2013 01-26 node.js
GroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hack
ラズパイ2で動く Docker PaaSを作ってみたよ
ラズパイ2で動く Docker PaaSを作ってみたよ
Node.jsでブラウザメッセンジャー
Node.jsでブラウザメッセンジャー
Heliumエンジンの設計と実装
Heliumエンジンの設計と実装
Lxc cf201207-presen
Lxc cf201207-presen
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
Rust-DPDK
Rust-DPDK
【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門
第2回勉強会スライド
第2回勉強会スライド
Mais de 裕士 常田
WeblateでOSSの翻訳に参加する
WeblateでOSSの翻訳に参加する
裕士 常田
Arduino library の作り方 2020
Arduino library の作り方 2020
裕士 常田
BlackMagic ProbeでARMをデバッグする
BlackMagic ProbeでARMをデバッグする
裕士 常田
HKマスクを作ってみた
HKマスクを作ってみた
裕士 常田
Openthread / nrf52811 調査(仮)
Openthread / nrf52811 調査(仮)
裕士 常田
いまどきの組込みOSの ZephyrRTOSと OpenThreadを Arduino環境で遊んでみる
いまどきの組込みOSの ZephyrRTOSと OpenThreadを Arduino環境で遊んでみる
裕士 常田
Arduino compatible layer (with 6LoWPAN) on Contiki
Arduino compatible layer (with 6LoWPAN) on Contiki
裕士 常田
KiCadで雑に基板を作る チュートリアル
KiCadで雑に基板を作る チュートリアル
裕士 常田
Mft2014 defeated
Mft2014 defeated
裕士 常田
DVB recording command on gstreamer.
DVB recording command on gstreamer.
裕士 常田
Traveltoitalia
Traveltoitalia
裕士 常田
Mais de 裕士 常田
(11)
WeblateでOSSの翻訳に参加する
WeblateでOSSの翻訳に参加する
Arduino library の作り方 2020
Arduino library の作り方 2020
BlackMagic ProbeでARMをデバッグする
BlackMagic ProbeでARMをデバッグする
HKマスクを作ってみた
HKマスクを作ってみた
Openthread / nrf52811 調査(仮)
Openthread / nrf52811 調査(仮)
いまどきの組込みOSの ZephyrRTOSと OpenThreadを Arduino環境で遊んでみる
いまどきの組込みOSの ZephyrRTOSと OpenThreadを Arduino環境で遊んでみる
Arduino compatible layer (with 6LoWPAN) on Contiki
Arduino compatible layer (with 6LoWPAN) on Contiki
KiCadで雑に基板を作る チュートリアル
KiCadで雑に基板を作る チュートリアル
Mft2014 defeated
Mft2014 defeated
DVB recording command on gstreamer.
DVB recording command on gstreamer.
Traveltoitalia
Traveltoitalia
Último
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NTT DATA Technology & Innovation
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
akihisamiyanaga1
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
FumieNakayama
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
Hiroshi Tomioka
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
博三 太田
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
FumieNakayama
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
UEHARA, Tetsutaro
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
Yuki Kikuchi
Último
(8)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
Node native ext
1.
Node.jsのネイティブ 拡張を作ってみる 常田 裕士
2.
Node.js Chromeで使っているJavaScriptのエンジン(v8)を、コマンドベースで実行 できるようにしたもの。 サーバーサイドJavaScript。ブラウザ上で使わない。
Scratch3.0もNode.jsで動いてる。
3.
ネイティブ拡張 スクリプト言語からC言語で書かれたライブラリを呼ぶ機能。 だいたいのスクリプト言語には備わっている。
それぞれの言語のマナーに合わせて、「いい感じの」インターフェースを を作るのがキモ。
4.
SWIG Ruby, Python,
Javaなんかで使われる、ネイティブ拡張生成のシステム。 独自のインターフェース定義言語から、自動的にGlueCodeを作る。 わりかしいい具合にやってくれるが、複雑なのはやっぱりしんどい。 JavaScriptはコールバック関数に対応していないなど、まだイマイチ
5.
N-API Node.jsのネイティブ拡張用API 中身のv8エンジンとは独立(というか、v8エンジンがコロコロ仕様変わる から、ネイティブ拡張に対して安定的なAPIを提供する目的で作られた。)
さらに、このN-APIをC++でラップしたnode-addon-apiが使われている。 開発環境もコマンドひとつでセットアップできるので便利。 今回はこのnode-addon-apiを使う。
6.
今回のネタ)IoTivity-Lite IoTの通信のハンドシェイク規格のIoTivityのコンパクト版 IoTivityはTizenとかで作っていた(Intel,
Sumsungなど) Tizenがあまりイケてなくて、開発が停滞。 IoT向けに絞ったIotivity-Liteが現在のメイン。 とはいえ、これも誰が使ってるんだかよくわからない… IEEE802.15.4で動いてるOpenThread関連だと、IoTivity-LiteとGoogleさんの OpenWeaveあたりがハンドシェイクとかペアリングの仕組みで使われている IoTivty-Liteの方が簡単そうなので、これを試してみる。 やはりスクリプト系を使いたいところが多いのでライブラリを作る。 まだ作りかけ。
7.
C言語との接続の設計 簡単な例 const
char* 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.
Napi::ObjectWrap Napi::ObjectWrapは、ネイティブ機能をラップするオブジェクトを作る。 Node.js側からはネイティブのメソッドを持ったオブジェクトに見える
ObjectWrapとは言ってるが、ラップの部分は面倒見てくれない。 自分で、ラップ class MyObject : public Napi::ObjectWrap<MyObject> {…}
10.
Napi::ObjectWrap Napi::ObjectWrap::Init()をオーバーライドして、コンストラクタを定義す る。 Napi::Function
X::Init(Napi::Env env, Napi::Ojbect exports) { Napi::Function func = DefineClass(env, “MyObject”, {InstanceMethod("plusOne", &MyObject::PlusOne) }); exports.Set(“MyObject", func); return exports; }
11.
Node.jsから呼び出す var obj
= new addon.MyObject(); console.log( obj.plusOne() ); new MyObject() Constructor obj. plusOne() PlusOne()
12.
ちょっと困ること console.dir()でネイティブのメソッド名は表示されない!
13.
Napi::External Napi::Externalの機能では、ネイティブのオブジェクトをハンドラを作ってNode.jsに渡せる。 Node.js側からは単なるブラックボックスのオブジェクト。メソッドなし、フィールドなし。
Napi::Object FunctionExt(const Napi::CallbackInfo& info) { Napi::Env env = info.Env(); void* mem = malloc(100); return Napi::External::New(env, mem); } Napi::Object Init(Napi::Env env, Napi::Object exports) { exports.Set(Napi::String::New(env, “function_ext"), Napi::Function::New(env, FunctionExt)); return exports; }
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::Env
env) { 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.
続・困るやつ(ネストされた class,struct) ネストされたstructがある場合、ネストされた中身は、別のstructの一部で ある場合もあれば、独立したインスタンスである場合もある。 独立したインスタンスは、それ自身のライフサイクルでメモリ開放すれば いいが、他のstructの一部である場合には、メモリを解放しない。
ラッパクラスは両方のパターンに対応する必要がある。 スマートポインタ的対応が必要
19.
ライフサイクル Node.jsのオブジェクトはGCで無くなる。 Node.js内で誰かがオブジェクトを参照していたら、GCされない
Node.jsのオブジェクトのライフサイクルと同期するネイティブ層は、GC からの通知でメモリを空ければよい。 Node.jsのオブジェクトのライフサイクルで動いているメモリをネイティ ブで握る場合はGCされないようにする必要がある。 Node.jsの仕組みの外で確保したメモリは自身で消す必要がある。
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(const
Napi::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でいけるはず。
Baixar agora