JNAのコードを読んでみた
NetBeansの利用ライブラリ一覧を眺めて、JNAなるライブラリを発見。
以前JNIについて調べたことがあったが、JNAはとっても便利そうだ。
.NETのP/Invokeっぽく使えてネイティブライブラリの資源が活用し
やすくなったと思う。ブリッジ用DLLとか作る必要なくなって、
Javaから直接ネイティブDLLを呼んでいる感じになるみたい。
P/Invokeのときみたいなエントリポイントのエイリアスとかどうやるんだろ?
今度サンプル作って試してしてみよう...。
CallBackを定義したJavaコードをネイティブで実行できるのは夢広がるなあ。
GPUで処理させたりできないかなあ。
少しいじってみたけど、どうやってこの仕組みを実現しているのか皆目
見当つかないなあ。
ということで、仕組みが知りたくなりソースを読んでみた。NetBeansの
プロジェクトなのでNetBeans利用すすることでコードが追いやすかった。
ざっくりいうと、JNAは2層構造でJava側とネイティブ側がある。
Java側はjava.lang.reflect.Proxyクラスを利用している模様。Proxy
クラスなんて初めて知ったが、JNAはこれを利用するサンプルとして
いいかも。
ネイティブ側はlibffiという代物を利用している。ffiはforeign function
interfaceの略らしいのだけど、これが良くわからん。 各種アーキテクチャ
ごとのフォルダが並んでいるので、きっとバイナリコードを読んでメタ
プログラミング的に定義されている関数を呼び出してくれる仕組みなんだ
ろうけど...。
詳細はサッパリ。そもそも拡張子.Sのファイルって...。
私には無理だわ...。
そもそも読む気が起きない。 (^_^;)
あとJNAの内部の仕組みについて、ウソ書いていたらごめんなさい。
以前JNIについて調べたことがあったが、JNAはとっても便利そうだ。
.NETのP/Invokeっぽく使えてネイティブライブラリの資源が活用し
やすくなったと思う。ブリッジ用DLLとか作る必要なくなって、
Javaから直接ネイティブDLLを呼んでいる感じになるみたい。
P/Invokeのときみたいなエントリポイントのエイリアスとかどうやるんだろ?
今度サンプル作って試してしてみよう...。
CallBackを定義したJavaコードをネイティブで実行できるのは夢広がるなあ。
GPUで処理させたりできないかなあ。
少しいじってみたけど、どうやってこの仕組みを実現しているのか皆目
見当つかないなあ。
ということで、仕組みが知りたくなりソースを読んでみた。NetBeansの
プロジェクトなのでNetBeans利用すすることでコードが追いやすかった。
ざっくりいうと、JNAは2層構造でJava側とネイティブ側がある。
Java側はjava.lang.reflect.Proxyクラスを利用している模様。Proxy
クラスなんて初めて知ったが、JNAはこれを利用するサンプルとして
いいかも。
ネイティブ側はlibffiという代物を利用している。ffiはforeign function
interfaceの略らしいのだけど、これが良くわからん。 各種アーキテクチャ
ごとのフォルダが並んでいるので、きっとバイナリコードを読んでメタ
プログラミング的に定義されている関数を呼び出してくれる仕組みなんだ
ろうけど...。
詳細はサッパリ。そもそも拡張子.Sのファイルって...。
私には無理だわ...。
そもそも読む気が起きない。 (^_^;)
あとJNAの内部の仕組みについて、ウソ書いていたらごめんなさい。
コメント