siteあるプログラマの勉強部屋。civicJNIを使用して、JavaからC言語の関数を呼び出す際には、次のような流れになります。classからヘッダファイルの生成ヘッダファイルに合うインターフェースでネイティブライブラリの作成クラスファイルから、ヘッダファイルを生成する必要があるので、先にネイティブライブラリを作ることはできません。したがって既にネイティブライブラリが出来上がっていて、それをJavaから使用したいという場合には、それをブリッジして呼び出すためのライブラリを作る必要があります。APIを呼び出す関数を作成して、それをJavaから呼び出す必要があります。ネイティブメソッドを呼び出すJavaソースサンプルとして、HelloWorldを出力するネイティブメソッドを使う例を書いてみました。}}staticブロックで、JNIモジュールのロードというのがあるが、これがDLLのロード処理dです。Native.dllをロードするために、”Native”と指定します。(拡張子dllはつけない。これがLinux環境だとdllではなくsoだったりするから。)4.で作成するDLLのファイル名がNative.dllだからこのように指定します。mainメソッドが呼び出されると、sayHelloメソッドをcallしています。sayHelloメソッドは、実装はなにもされておらず宣言だけされています。キーワードとしてnativeという宣言が付いているのが特徴です。中身はなにも記述せず、パラメータや戻り値のインターフェースだけは決めるためにこのように記述します。中身はどこにあるかというと、native.dllに書くからです。JNIモジュールのロードという部分をstaticブロックに記述しています。これはJNIHelloクラスがロードされたときに一度だけdllをロードすればよいためです。ロードされるようになります。2回newを行い、2つのインスタンスを生成した場合には、2回目のnewですでにdllがロードされているにも関わらず、再びロードしようとしてしまいます。staticブロックに書けばこれはOKです。これで1.の作業は完了。これをコンパイルすれば2.は完了。ヘッダファイルの作成ヘッダファイルの作成は簡単です。1.でコンパイルしたclassファイルを使用して、javahというSDK付属のツールを使用すると、このclassに必要なヘッダファイルを自動生成してくれます。コマンドプロンプトから、classファイルのあるディレクトリに移動後、以下のコマンドを実行します。パッケージ名がある場合にはクラスパスのルートを指定する事に注意。javahの引数で-classpathを指定しても良いです。JNIHelloできあがったヘッダファイルを見ると、sayHelloのインターフェースが定義されています。jclass);これをC言語で実装したDLLを作ることになるわけです。これで3.の作業は終了。ネイティブライブラリの作成このインターフェースを実装するかたちでC言語でDLLを作成します。WindowsだからDLLになります。World\n");}JNIHello.hと同じディレクトリにNative.cppというファイルを作成しました。コンパイルは、こんな感じで、JDKに付属のヘッダファイルをインクルードパスで指定する必要があります。Native.cppJDK_HOMEと書いたのはJDKのインストールディレクトリ。これでNative.dllというDLLが作成されます。これで全作業が完了しました。実行する際には、Native.dllが適切な場所にインストールされる必要があります。Windows環境ではPATHの通っているディレクトリに配置します。Unix関係ではLD_LIBRARY_PATHに追加します。javaの起動時に、-Djava.library.path=モジュールを置いてあるディレクトリというようにシステムプロパティで指定することも出来ます。他の環境を汚さないことを考えれば、後者の方が他に影響を与えないので良いと思います。JNIHelloとするだけで動作が確認できます。JNIHelloとしてみるとよいです。ファイルとして認識されていません。コメントをキャンセルメールアドレスが公開されることはありません。date*日本語が含まれない投稿は無視されますのでご注意ください。コメントデータの処理方法の詳細はこちらをご覧ください。@civicガジェット好きなソフトウェアプログラマー。SeatNextなどを開発しました。