Java 学習:jnr-ffi 導入

2017-04-28 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-04-26)の記事「Java SE 8 導入」で、
Java 開発環境が出来た(?)ので、

「Java FFI」と検索してみたら、・・・・・

今日もプログラミング
jnr-ffiでJavaからCを呼び出す (Windows)」が見つかった。

  jnr-ffiとは?

  JavaからCを呼び出す、と言えばJNIだが、
  C側にJNI固有の処理を書いたりするので結構めんどい。

  jnr-ffiというフレームワークを使うと、
  C側の関数をそのままJavaにマッピングして呼べるらしい。

  具体的には、C側に
int length(char *s)
  のような関数があると、Java側から
int length(String s)
  というほぼそのままのメソッドで呼び出せてしまう!

  という訳で、今回はこのjnr-ffiを実際に試してみる。
  ・・・・・
  ・・・・・

これは!
(<紙>でも)使えるモノなら、使いたい。

これ:jnr/jnr-ffi
ですね。


それで、
  jnr-ffiをダウンロードする
に従って、

 1番目のサイトから「jnr-ffi-2.0.3.jar」
 2番目のサイトから「jffi-1.2.9-native.jar」と「jffi-1.2.9.jar」
 3番目のサイトから「asm-5.0.3-bin.zip」

以上をダウンロードした。

3番目の ZIP 書庫の中には、6つある:
 「asm-5.0.3.jar」、「asm-analysis-5.0.3.jar」、
 「asm-commons-5.0.3.jar」、「asm-tree-5.0.3.jar」、
 「asm-util-5.0.3.jar」、「asm-xml-5.0.3.jar」


それから?

取り敢えず、
上記9つの .jar ファイル名からバージョン番号(ハイフンも)外した。

そして、
jnr/jnr-ffi
Example「helloworld」
をコピペし、コンパイル:
javac  -cp  jnr-ffi.jar  helloworld.java
ここで、“-cp”とは、“--classpath”のコト?

helloworld.class ファイルは出来た。
が・・・・・
実行:
java  helloworld
でアボート?????


さんざん悩んだ挙げ句、・・・・・

9ヶの「~.jar」を解凍して、併合した。

結果、4つのフォルダにまとまった:
「jnr/ffi」 以下6フォルダと183ファイル
「jni」 以下13フォルダ
「com/kenai/jffi」 以下1フォルダと122ファイル
「org/objectweb/asm」 以下5フォルダと22ファイル

これらを、
  C:/_kami_/ に格納し、

classpath に c:/_kami_ を追加した。

ここで、注意することは、カレント Dir の扱い!
  参照:「CLASSPATH

なので、
コンパイルは:
javac  -cp  .;C:/_kami_  hoge.java
とし、
実行は:
java  -cp  .;C:/_kami_  hoge
でも、
上記は上手く行かない???


そこで、
3年前(2014-05-18)の記事「Python 学習:ctypes 入門
で作った「test_dll.dll」を使ってテスト。
// ===== k_testC =====
import jnr.ffi.LibraryLoader; // 全4Dir必要

public class k_testC{ // これはファイル名と同じ

public static interface libC { // これは適切に
int Add( int a, int b ); // 呼出関数のプロトタイプ
}

public static void main(String[] args) { // これは固定

libC klib = LibraryLoader.create(libC.class).load("test_dll");
// 適切に ^^^^^^^^^^^^ 上記 呼出DLL名

int zz = klib.Add( 10, 20 );
// 上記

System.out.print( zz );

}
}
/* コンパイルは:
   javac -cp .;C:/_kami_ k_testC.java
これで、2つの .class が出来る。

実行は:
   java -cp .;C:/_kami_ k_testC

いずれにおいても、4フォルダは必要
実行時には、更に両 class ファイルが必要
*/
これは動いた。

jnr-ffiが使えた。 バンザイ!

でも、何故 本家の Example が動かない???
  LibC libc = LibraryLoader.create(LibC.class).load("c");
.load("c") が問題???


本日はここまで。


Java 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


170326
関連記事
スポンサーサイト

コメントの投稿

管理者にだけ表示を許可する

おきてがみ/blogram
blogram投票ボタン



おきてがみ

最新記事
カレンダー
05 | 2017/06 | 07
- - - - 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 -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

カウンター(fc2、i2i) /Google Analytics


i2i(from 2010-08-24)
Total =
Today  =  
Yesterday=
アンチエイジング

Google Analytics
ブックマーク