Submit Search
Javaにおけるネイティブコード連携の各種手法の紹介
Download as PPTX, PDF
15 likes
12,392 views
K
khisano
JJUG CCC 2015 Fallの「Javaにおけるネイティブコード連携の各種手法の紹介」での発表資料です。 #jjug_ccc #ccc_cd7
Technology
Read more
1 of 35
Download now
Downloaded 54 times
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
More Related Content
PDF
Mavenの真実とウソ
Yoshitaka Kawashima
PDF
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
Unity Technologies Japan K.K.
PPTX
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
PDF
デキるプログラマだけが知っているコードレビュー7つの秘訣
Masahiro Nishimi
PDF
Spring Data RESTを利用したAPIの設計と、作り直しまでの道のり
Rakuten Group, Inc.
PDF
新入社員のための大規模ゲーム開発入門 サーバサイド編
infinite_loop
PDF
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
Y Watanabe
PPTX
SPAセキュリティ入門~PHP Conference Japan 2021
Hiroshi Tokumaru
Mavenの真実とウソ
Yoshitaka Kawashima
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
Unity Technologies Japan K.K.
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
デキるプログラマだけが知っているコードレビュー7つの秘訣
Masahiro Nishimi
Spring Data RESTを利用したAPIの設計と、作り直しまでの道のり
Rakuten Group, Inc.
新入社員のための大規模ゲーム開発入門 サーバサイド編
infinite_loop
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
Y Watanabe
SPAセキュリティ入門~PHP Conference Japan 2021
Hiroshi Tokumaru
What's hot
(20)
PPTX
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
慎一 古賀
PDF
ストリーム処理を支えるキューイングシステムの選び方
Yoshiyasu SAEKI
PDF
VPCのアウトバウンド通信を制御するためにおさえておきたい設計ポイント
Takuya Takaseki
PDF
ドキュメントシステムはこれを使え2015年版
Keiichiro Shikano
PDF
ドメイン駆動設計 ( DDD ) をやってみよう
増田 亨
PPTX
Redisの特徴と活用方法について
Yuji Otani
PDF
Dockerからcontainerdへの移行
Kohei Tokunaga
PPTX
JIRA / Confluence の必須プラグインはこれだ
Narichika Kajihara
PDF
Dockerfileを改善するためのBest Practice 2019年版
Masahito Zembutsu
PDF
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015
Toru Yamaguchi
PDF
例外設計における大罪
Takuto Wada
PDF
シリコンバレーの「何が」凄いのか
Atsushi Nakada
PDF
コンテナの作り方「Dockerは裏方で何をしているのか?」
Masahito Zembutsu
PDF
怖くないSpring Bootのオートコンフィグレーション
土岐 孝平
PDF
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
PDF
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
Koichiro Matsuoka
PDF
オープンソースのAPIゲートウェイ Kong ご紹介
briscola-tokyo
PPTX
世界一わかりやすいClean Architecture
Atsushi Nakamura
PDF
入社1年目のプログラミング初心者がSpringを学ぶための手引き
土岐 孝平
PDF
traitを使って楽したい話
infinite_loop
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
慎一 古賀
ストリーム処理を支えるキューイングシステムの選び方
Yoshiyasu SAEKI
VPCのアウトバウンド通信を制御するためにおさえておきたい設計ポイント
Takuya Takaseki
ドキュメントシステムはこれを使え2015年版
Keiichiro Shikano
ドメイン駆動設計 ( DDD ) をやってみよう
増田 亨
Redisの特徴と活用方法について
Yuji Otani
Dockerからcontainerdへの移行
Kohei Tokunaga
JIRA / Confluence の必須プラグインはこれだ
Narichika Kajihara
Dockerfileを改善するためのBest Practice 2019年版
Masahito Zembutsu
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015
Toru Yamaguchi
例外設計における大罪
Takuto Wada
シリコンバレーの「何が」凄いのか
Atsushi Nakada
コンテナの作り方「Dockerは裏方で何をしているのか?」
Masahito Zembutsu
怖くないSpring Bootのオートコンフィグレーション
土岐 孝平
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
Koichiro Matsuoka
オープンソースのAPIゲートウェイ Kong ご紹介
briscola-tokyo
世界一わかりやすいClean Architecture
Atsushi Nakamura
入社1年目のプログラミング初心者がSpringを学ぶための手引き
土岐 孝平
traitを使って楽したい話
infinite_loop
Ad
Viewers also liked
(20)
PDF
Java8 Stream APIとApache SparkとAsakusa Frameworkの類似点・相違点
hishidama
PDF
【こっそり始める】Javaプログラマコーディングマイグレーション
yy yank
PDF
よくある業務開発の自動化事情 #jjug_ccc #ccc_cd3
irof N
PDF
Real world machine learning with Java for Fumankaitori.com
Mathieu Dumoulin
PPTX
日本 Java ユーザーグループ JJUG CCC 2015 Fall by ソラコム 片山
SORACOM,INC
PDF
プログラム初心者がWebサービスをリリースして運営するまで
Tomoaki Iwasaki
PPT
デバッガのしくみ(JDI)を学んでみよう
fukai_yas
PPTX
Java8移行から始めた技術的負債との戦い(jjug ccc 2015 fall)
sogdice
PDF
Reactive Webアプリケーション - そしてSpring 5へ #jjug_ccc #ccc_ef3
Toshiaki Maki
PDF
マイクロサービスアーキテクチャ - アーキテクチャ設計の歴史を背景に
Yusuke Suzuki
PDF
タイムマシン採用:明日のエンタープライズJavaの世界を予想する -Java EE7/クラウド/Docker/etc.-
Takakiyo Tanaka
PDF
Jjugccc2017spring-postgres-ccc_m1
Kosuke Kida
PDF
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
Hiroyuki Ohnaka
PPTX
U-NEXT学生インターン、過激なJavaの学び方と過激な要求
hajime funaki
PDF
Arachne Unweaved (JP)
Ikuru Kanuma
PDF
VMの歩む道。 Dalvik、ART、そしてJava VM
yy yank
PDF
2017spring jjug ccc_f2
Kazuhiro Wada
PPTX
Kotlin is charming; The reasons Java engineers should start Kotlin.
JustSystems Corporation
PPTX
Jjug ccc
Tanaka Yuichi
PDF
Java libraries you can't afford to miss
Andres Almiray
Java8 Stream APIとApache SparkとAsakusa Frameworkの類似点・相違点
hishidama
【こっそり始める】Javaプログラマコーディングマイグレーション
yy yank
よくある業務開発の自動化事情 #jjug_ccc #ccc_cd3
irof N
Real world machine learning with Java for Fumankaitori.com
Mathieu Dumoulin
日本 Java ユーザーグループ JJUG CCC 2015 Fall by ソラコム 片山
SORACOM,INC
プログラム初心者がWebサービスをリリースして運営するまで
Tomoaki Iwasaki
デバッガのしくみ(JDI)を学んでみよう
fukai_yas
Java8移行から始めた技術的負債との戦い(jjug ccc 2015 fall)
sogdice
Reactive Webアプリケーション - そしてSpring 5へ #jjug_ccc #ccc_ef3
Toshiaki Maki
マイクロサービスアーキテクチャ - アーキテクチャ設計の歴史を背景に
Yusuke Suzuki
タイムマシン採用:明日のエンタープライズJavaの世界を予想する -Java EE7/クラウド/Docker/etc.-
Takakiyo Tanaka
Jjugccc2017spring-postgres-ccc_m1
Kosuke Kida
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
Hiroyuki Ohnaka
U-NEXT学生インターン、過激なJavaの学び方と過激な要求
hajime funaki
Arachne Unweaved (JP)
Ikuru Kanuma
VMの歩む道。 Dalvik、ART、そしてJava VM
yy yank
2017spring jjug ccc_f2
Kazuhiro Wada
Kotlin is charming; The reasons Java engineers should start Kotlin.
JustSystems Corporation
Jjug ccc
Tanaka Yuichi
Java libraries you can't afford to miss
Andres Almiray
Ad
Javaにおけるネイティブコード連携の各種手法の紹介
1.
Javaにおける ネイティブコード連携の 各種手法の紹介 NTTレゾナント・テクノロジー(株) 久納 孝治(ひさのう こうじ) hisano
2.
自己紹介 久納 孝治
(ひさのう こうじ) NTTレゾナント・テクノロジーでRemote TestKitを作っています。 「今まで作ったもの」 世界初のケータイJava向けGameBoyエミュレータ (2002年のJavaOneで発表) http://www.itmedia.co.jp/mobile/0209/26/n_game.html Skype社の公認のオフィシャルAPIに選定されたSkype4Java http://www.itmedia.co.jp/enterprise/articles/0710/05/news132.html Pure JavaによるDalvik VMインタープリタ http://code.google.com/p/android-dalvik-vm-on-java/ MIDP→iアプリ変換ツール (Opera Miniのiアプリ版で採用) http://www.itmedia.co.jp/mobile/articles/1106/15/news106.html など
3.
Pure JavaによるDalvik VMインタープリタ
AndroidのDalvik VMの仕様書から実装 Java ME上で動作するインタープリタ (知る限りではクリーンルーム実装では世界初) サポートしている機能 Dalvik VMの全命令 Java ME CLDCのAPI群 wait・notify等を含むマルチスレッド関連(グリーンスレッドで実現)
4.
MIDPアプリ→iアプリ変換ツール Java MEのMIDPアプリのjarをiアプリのjarに静的変換するツール
+ MIDP APIのランタイム から構成 静的変換ツールはjavassistライブラリを用いて実装 ・javax.microeditionのクラス参照をtv.hisano.doja.runtime.midpパッケージに変換 ・System#getProperty呼び出しを独自のクラスメソッド呼び出しに変換 ・Class#getResourceAsStream呼び出しを独自のクラスメソッド呼び出しに変換 ・などなど MIDP APIのランタイムをクリーンルーム実装 ・ピュアJavaのPNGデコーダを組み込み ・OpenGLを用いた高速な画面描画コンポーネントを組み込み Opera社とOpera miniのiアプリ版としてリリース(現在は公開終了)
5.
本編
6.
Javaでネイティブコードを使う意義 Javaで書かれていない豊富な各種ライブラリの利用 例: TensorFlow、Bonanza 弊社での利用例:
コンピュータビジョンライブラリ(OpenCV)、iOS端末管理 (libimobiledevice)、ChromeのPDFエンジン(Pdfium) OS特有の機能の利用 例: Windowsのジャンプ・リスト、OS Xの通知センター 弊社での利用例: プロセス情報取得(winp)、UNIXドメインソケット(junixsocket) GPU・CPUをフルに使った高速化 例: DirectX、WebRTC 弊社での利用例: 音声・ビデオコーデック(OpenH264) 既存資産のポーティングの手間の軽減
7.
ネイティブコードを組み込む方法 開発工数 品質 できること ①
ラップした既存ライブラリを利用 ◎ ? △ ② Javaのみでネイティブ連携を行えるライブラリ を利用 ○ ○ ○ ③ JNIを利用 △ △ ◎
8.
ラップした既存ライブラリを利用
9.
GitHubで既存ライブラリを検索 アドバンスド検索 https://github.com/search/advanced プレフィックスを用いた絞り込み https://help.github.com/categories/search/ 他の応用例: jnrとjnaどちらが使われているか? jna
filename:pom.xml fork:false→3263件 jnr-ffi filename:pom.xml fork:false→47件
10.
利用例: JavaCV JavaからOpenCVを使えるライブラリ
OpenCVにも本家Javaライブラリがあるものの、セットアップの容易さからJavaCV がオススメ Apacheライセンス or クラスパス例外ありのGPLのデュアルライセンス 類似領域検索での利用例
11.
利用例: winp JavaからWindowsのプロセス管理を行うためのライブラリ
Jenkinsを作られている川口さん作でMITライセンス サポートしている機能 プロセス情報の取得 プロセスの強制終了 プロセスの優先順位変更 OSからのログオフ・リブート など プロセス一覧を表示するコード
12.
Javaのみでネイティブ連携コードを 書けるライブラリを利用
13.
この手法のメリット JNIで連携コードを別途書く必要なし OSごとのネイティブライブラリの準備が不要
Javaのデバッガを用いての開発が可能
14.
com4j COMコンポーネントをJavaから使えるようにするライブラリ Jenkinsを作られている川口さん作
BSDライセンス ライブラリを生成 ライブラリを利用
15.
SWTのinternal API EclipseのGUIライブラリのSWTの下回り(org.eclipse.swt.internal)には大量のOS特 有コード
Windows: Win32/Win64 OS X: Cocoa Skype4Javaでの利用例
16.
JNA JavaインターフェイスでC関数を定義するとバインドしてくれるライブラリ Apacheライセンス
or LGPLのデュアルライセンス 似たライブラリとしてJNRあり ① JavaインターフェイスでC関数を定義 ② インターフェイス定義からプロキシを生成 ③ 実際の処理で利用
17.
JNAのnativeメソッド定義による利用 nativeメソッドを定義したクラスをNative#registerメソッドに渡すだけで、JNIラ イブラリを用意したように呼び出すことが可能に pdfium4jでのnativeメソッド定義による利用例
18.
JNAでのJavaリスナーの登録 Javaのリスナーを、Cの関数ポインタのようにコールバックとして登録可能
19.
JNAでのAPI差分の吸収 JNAの各種処理をフックしてAPI差分を吸収することが可能 ・Javaのインスタンス→ネイティブオブジェクトの対応関係変更(TypeMapper) ・Javaのメソッド→C関数名の対応関係変更(FunctionMapper) ・C関数の呼び出し処理の前後に処理を追加(InvocationMapper) C関数名の変更を吸収する例
20.
JNAerator ヘッダーファイルからJNAを用いたコードを生成してくれるツール JNAだけでなく、BridJ・Rococoa・node.js向けのコード出力も可能
21.
JavaCPP Javaクラス +
アノテーションでC++クラスを定義すると、クラス定義を元にJNI コードを生成して使えるようにしてくれるライブラリ JavaCVの下支えのライブラリ Apacheライセンス or GPLのデュアルライセンス javacpp-presetsリポジトリに豊富な定義が存在(CUDA、FFmpeg等) TensorFlowの定義も追加! おそらく次のバージョンで楽に使えるように。 https://github.com/bytedeco/javacpp- presets/blob/master/tensorflow/src/main/java/org/bytedeco/javacpp/tensorflo w.java
22.
今まで紹介した手法の問題点 不正なポインタを利用するとプロセスごと落ちてしまう問題あり 各OS・CPUアーキテクチャごとにネイティブライブラリを用意する必要あり LLVMを調査している時にいい手法を思いついたので、 j2js2nc(Java
to JavaScript to Native Code)ライブラリ を作ってみました!
23.
LLVMの紹介 コンパイラ開発に必要な各種コンポーネントを提供するコンパイラ基盤 Clang: C/C++/Objective-Cから中間表現のIRを生成するコンポーネント LLVM
Core: IRから各種CPU向けバイナリを生成するための各種コンポーネント LLDB: ClangやLLVM Coreを使って実装されたデバッガ BSDライセンスに似た使いやすいライセンス (ユーザ目線では新しいコンパイラと捉えるのがいいかも) Clang C/C++フロントエンド LLVM Optimizer x86バックエンド ARMバックエンド PowerPCバックエンド
24.
Emscriptenの紹介 C/C++コードをJavaScriptにコンパイルするツール Unity等での応用例: https://github.com/kripken/emscripten/wiki/Porting- Examples-and-Demos Win
32 APIでの応用例: https://github.com/klutzy/win32.js MS-DOSゲーム: https://archive.org/details/softwarelibrary_msdos_games Windows・OS X・Linux向けに提供 LLVMのバックエンドでCPU特有のバイナリではなく、JavaScriptコードを生成 JavaScriptサブセット仕様のasm.jsを用いて高速化 Clang C/C++フロントエンド LLVM Optimizer Emscriptenバックエンド(Fastcomp)
25.
Emscriptenによるwin32.jsの実現方法 JavaScriptコード Emscriptenで変換 fake-mswin - JavaScriptライブラリ Win32エミュレーションライブラリ
26.
j2js2ncライブラリの紹介 j2js2ncはEmscripten版JNA Emscriptenを利用するメリット
ネイティブコードが、マシン語ではなくJavaScriptとなるため、OSやCPUに非依存 Nashorn上でマシン語相当が動作するため、不正なポインタによってプロセスが終了する ことがない JNA 4.1の下回りを実装し直して実現しているため、JNAの豊富な高度な機能はそ のまま利用可能 Javaインスタンスの自動マッピング メソッド→関数のマッピングルール変更 など C/C++コード JavaScript Java Emscriptenで変換 生成されたJavaScriptコードはJava 8から搭載されたNashorn上で実行 Javaインターフェイス + j2js2ncでC関数を自動バインド
27.
j2js2ncの具体的な利用の流れ #include <stdio.h> #include <stdlib.h> void
hello(char *name) { printf("Hello, %s!n", name); } $ emcc hello.c -s EXPORTED_FUNCTIONS="['_hello']" -o js/hello.js package jp.hisano.sample; import jp.hisano.j2js2nc.Library; import jp.hisano.j2js2nc.Native; public class Main { public interface Hello extends Library { void hello(String name); } public static void main(String[] args) throws Exception { Hello library = (Hello) Native.loadLibrary("hello", Hello.class); library.hello("j2js2nc"); } } hello.dll等に相当するhello.jsを生成 Libraryインターフェイスを継承してメソッドを定義するだけ でC関数が利用可能
28.
JNAとj2js2ncの内部処理の違い
29.
JNAでの内部処理 #include <stdio.h> #include <stdlib.h> void
hello(char *name) { printf("Hello, %s!n", name); } Hello library = (Hello) Native.loadLibrary("hello", Hello.class); library.hello("j2js2nc"); JNA処理 1. StringインスタンスをJNAオブジェクトに変換(NativeString インスタンスの生成) 2. JNAオブジェクトからネイティブオブジェクトに変換 (malloc関数でバイト配列を確保) 3. libffi経由でネイティブライブラリの関数を呼び出し GC実行時 1. finalizeメソッド実行時にfree関数が呼び出されて解放
30.
j2js2ncでの内部処理 #include <stdio.h> #include <stdlib.h> void
hello(char *name) { printf("Hello, %s!n", name); } Hello library = (Hello) Native.loadLibrary("hello", Hello.class); library.hello("j2js2nc"); J2js2ncの処理 1. Stringインスタンスをj2js2ncオブジェクトに変換 (NativeStringインスタンスの生成) 2. j2js2ncオブジェクトからネイティブオブジェクトに変換 (_malloc関数でバイト配列を確保) 3. javax.script経由でJavaScript関数を呼び出し GC実行時 1. finalizeメソッド実行時に_free関数が呼び出されて解放 JNA処理 1. StringインスタンスをJNAオブジェクトに変換(NativeString インスタンスの生成) 2. JNAオブジェクトからネイティブオブジェクトに変換 (malloc関数でバイト配列を確保) 3. libffi経由でネイティブライブラリの関数を呼び出し
31.
いろいろな問題とその解決方法
32.
ポインタのサポート ポインタは何バイト? Emscriptenでは32-bitマシンとしてコンパイル long型・wchar_t型・size_t型も、すべて32-bit 定義の初期化のメソッド
33.
64-bit整数型のサポート JavaScriptは64-bit浮動小数点型のみ、64-bit整数型の引数や戻り値は? 一つの64-bit整数引数を、二つの32-bitビット整数(実体は64-bit浮動小数点型)に分割 戻り値の64-bit整数の上位32-bitはtempRet0というグローバル変数に入れて返却 戻り値の処理 引数の処理
34.
処理速度が遅い 1バイトのメモリアクセスごとにJavaScriptのパース・実行処理が行われて低速 Nashornの内部APIを直接使う形にして高速化 (BufferArgumentsMarshalTestテストの実行時間が20秒から2.5秒に短縮!) 変更後変更前
35.
様々なネイティブ連携手法があるJavaは 最高です! ご清聴ありがとうございました。
Download