JNI その1:Javaからネイティブコードを呼び出す
Windows上で実施。
コンパイラはボーランドC++コンパイラを使用。
作業するフォルダは C:\work\Chap10\10-2 とする。
下記のフォルダ、ファイルのツリー表示で括弧で囲ってあるファイルはツール(javac、javah、Cコンパイラ)が出力するファイル。
作業フォルダ │ jni-sample.c │ [jni-sample.dll] │ [jni-sample.obj] │ [jni-sample.tds] … デバッグ用のシンボルファイル │ [oesf_ace_JniCallToNativeFromJava.h] │ └─oesf └─ace [JniCallToNativeFromJava.class] JniCallToNativeFromJava.java
- Javaのコードを作成
- JNIヘッダファイルを作成
- ネイティブコードを作成し共有ライブラリの作成
- 実行
Javaコードの作成
コードの場所はパッケージに合わせる。以下のコードの場合は.\oesf\ace に置く。
package oesf.ace; public class JniCallToNativeFromJava { static { System.loadLibrary("jni-sample"); } public native boolean isOne(int value); public static void main(String[] args) { JniCallToNativeFromJava jni = new JniCallToNativeFromJava (); Boolean res = jni. isOne ( 1 ); System.out.printf("res = " + res); } }
作業フォルダでjavacコマンドを実行しコードをコンパイルする。
C:\work\Chap10\10-2>javac oesf\ace\JniCallToNativeFromJava.java
JNIヘッダの作成
作業フォルダでjavahコマンドを実行する。引数はファイル名ではなくクラスの完全修飾名。
命名規則に則った名前の関数の宣言がされたoesf_ace_JniCallToNativeFromJava.h というファイルが作業フォルダに作られる。
C:\work\Chap10\10-2>javah -jni oesf.ace.JniCallToNativeFromJava
命名規則は以下。
- 接頭辞に「Java_」。
- 完全修飾クラス名を分解し、それらとメソッド名をアンダースコアで連結する。
上記のJavaソースコードから命名規則に従うとネイティブメソッドの名前は
JNIEXPORT jboolean JNICALL Java_oesf_ace_JniCallToNativeFromJava_isOne(JNIEnv *, jobject, jint)
となる。
ネイティブコードを作成し共有ライブラリの作成
書籍に載っていたコードを少し修正。JNIヘッダがCソースファイルと同じフォルダにあるので、JNIヘッダを大なり小なりではなくダブルクウォーテーションで囲むように修正した。
#include <jni.h> #include "oesf_ace_JniCallToNativeFromJava.h" jboolean JNICALL Java_oesf_ace_JniCallToNativeFromJava_isOne (JNIEnv* env, jobject this, jint value) { if(value == 1) { return JNI_TRUE; } return JNI_FALSE; }
これをコンパイルしてDLLを作成。
インクルードファイルのパスとして
<JDKのフォルダ>\include
<JDKのフォルダ>\include\win32
を追加する。
ボーランドC++コンパイラの場合はコンパイラのbinフォルダにある bcc32.cfg を修正するか、コマンドのオプションに追加する。
今回は bcc32.cfg を次のようにした。
-I"c:\Borland\Bcc55\include";"C:\progra~1\Java\jdk1.6.0_24\include";"C:\progra~1\Java\jdk1.6.0_24\include\win32" -L"c:\Borland\Bcc55\lib"
DLLは以下のコマンドで作成。
C:\work\Chap10\10-2>bcc32 -c jni-sample.c Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland jni-sample.c: 警告 W8057 jni-sample.c 10: パラメータ 'env' は一度も使用されない(関数 Java_oesf_ace_JniCallToNativeFromJava_isOne ) 警告 W8057 jni-sample.c 10: パラメータ 'this' は一度も使用されない(関数 Java_oesf_ace_JniCallToNativeFromJava_isOne ) C:\work\Chap10\10-2>bcc32 -tWD -ejni-sample.dll jni-sample.obj Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
実行
C:\work\Chap10\10-2>java oesf.ace.JniCallToNativeFromJava res = true
参考文献:Androidアプリケーション開発標準資格教科書 10-2 Javaからネイティブコードの呼び出し
参考サイト:
Java Native Interface 仕様の目次
Borland C++ Compiler DLL作成
bcc32でDLLを作成する - 偏った言語信者の垂れ流し
Borland C++ Compiler Bcc32コマンドオプション
« 新潟ミシェウの技ありゴールで勝利、磐田アウェイで3発快勝 | Main | JNI その2:ネイティブコードからJavaメソッドを呼び出す »
「Java」カテゴリの記事
- 正規表現メモ(2013.10.07)
- Androidアプリ開発メモ068:Tweenアニメーション(2012.11.18)
- Androidアプリ開発メモ067:NDKのサンプルを動かしてみた(2012.09.10)
- JNI その2:ネイティブコードからJavaメソッドを呼び出す(2012.08.29)
- JNI その1:Javaからネイティブコードを呼び出す(2012.08.26)
The comments to this entry are closed.
« 新潟ミシェウの技ありゴールで勝利、磐田アウェイで3発快勝 | Main | JNI その2:ネイティブコードからJavaメソッドを呼び出す »
Comments