投稿

ラベル(JNI)が付いた投稿を表示しています

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

最近の流行はJNI 現在仕事で.netを利用しており、度々ネイティブコードを 呼ぶ必要が出てきており、P/Invokeのお世話になっている。 そんなときjavaではネイティブコードとの連携はどうなのよ? という疑問がふと起きまして、調べている。 JNIってJavaプラットフォームを構築するなくてはならない基盤技術だと 思うけど案外情報が少ない気がする。 OpenJDK読むにはこの知識必須っぽいよ? 単に調べ足りないだけかな?海外のサイトならたくさんあるのかな。 とりあえずsunのJavaのリファレンスマニュアルと、日本語で数少ない ピアソン・エデュケーションのJNI本を買って読んでる。 C/C++相手なので、メモリ管理やマルチスレッドに対する記述について、 安全なお決まりの書き方のようなものがあれば知りたいと思ったのだけど、 具体的なサンプルコードはweb上ではあまり見つからなかった。 サンプルコードで手に入ったのはOpenJDKだったので、ちょろっと読んで みた。意外だったのは、Stringクラスのネイティブコード部分が意外に 少なかったこと。見間違えでなければJNIの関数は1つしかなかった。   【2008/09/22追記】   ↑よくよく見たらネイティブコード(hotspotのコード)に    java_lang_Stringクラスとかある。 …ん~わからん。 投 昔Stringクラスは高速化のためネイティブコードを 活用しているようなこと聞いた気がするんだけどなあ。 バージョンによって違うのかな? 私のような初心者にはまだ早すぎたようです...。出直します。 気を取り直し、まずは購入したJNIの本を読んでみことにする。 JNIは前世紀でほぼ固まった仕様っぽく、購入した本も1998年初版の 本だけど、新宿紀伊国屋で買ったこの本はやけにきれいだった。 焼けて黄ばんでいるかと思ったけどそんなことなく。 やっぱり需要はあって、コンスタントに売れているのかも。