My Photo

« 新潟ミシェウの技ありゴールで勝利、磐田アウェイで3発快勝 | Main | JNI その2:ネイティブコードからJavaメソッドを呼び出す »

August 26, 2012

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

  1. Javaのコードを作成
  2. JNIヘッダファイルを作成
  3. ネイティブコードを作成し共有ライブラリの作成
  4. 実行

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」カテゴリの記事

Comments

Post a comment

(Not displayed with comment.)

TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/26461/55514782

Listed below are links to weblogs that reference JNI その1:Javaからネイティブコードを呼び出す:

« 新潟ミシェウの技ありゴールで勝利、磐田アウェイで3発快勝 | Main | JNI その2:ネイティブコードからJavaメソッドを呼び出す »

April 2017
Sun Mon Tue Wed Thu Fri Sat
            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            
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof