人気ブログランキング | 話題のタグを見る

第6ぶろぐ

JNI その2 仮完了

とりあえず動くものができた。
前回上手く動かなかったのは、『-lstdc++』がなかったせいのようだ。
というか、『-lstdc++』を付けなくてはいけない理由がわからない。
これに関しては今後調べるとして、まずはJNIを動作させる方法のまとめ。

手順は次の通り。
1.Javaソースの作成
2.C++用のヘッダファイルの作成
3.C++ソースの作成
4.C++ソースからDLL作成
5.Pathの設定
6.実行

これでC/C++を使った高速処理が実装できる。はず(ぉ

それにしても『-lstdc++』が気になるなぁ。。。
知ってる人がいたら教えてほしいな。

【動作環境】
OS:CentOS5.0
JDK:1.6.0_06
gcc:4.1.2




Javaソースの作成。
vi TestJNI.java

ソースの内容:
public class TestJNI{
static{
System.out.loadLibrary("TestJNI");
}
public native String showString();

public static void main(String[] args){
TestJNI testjni = new TestJNI();
System.out.println(testjni.showString());
}
}

Javaのビルド。
Javac TestJNI.java

ビルドが正常に終わったら、作成したクラスよりC++用のヘッダファイルを作成する。
javah -jni TestJNI
これで自然と、『TestJNI.h』っていうファイルができるはず。

C++ソースの作成。
vi TestJNI.cpp

ソースの内容:
#include <string.h>
#include "TestJNI.h";
JNIEXPORT jstring JNICALL java_TestJNI_showString(JNIEnv *env, jobject obj){
jstring str = env->NewStringUTF("TestJNI OK");
return str;
}

DLLの作成。
gcc -shared -lstdc++ -I/usr/java/jdk1.6.0_06/include/ -I/usr/java/jdk1.6.0_06/include/linux/ TestJNI.cpp -o libTestJNI.so
※Linux用のDLLは、頭に『lib』をつけるのと、拡張子を『.so』にすること。
『-lstdc++』をつけないと、Java実行時に『undefined symbol: __gxx_personality_v0』ってエラーがでる。
DLL作成時はエラーでないんだけどなぁ。

作成したDLLを読み込むようにパスを設定する。
export LD_LIBRARY_PATH=.
※.soが出力されているところ指定する。

あとはJavaを起動。
Java TestJNI
『TestJNI OK』と表示されるはず。

■おまけ
Cソースで試す場合はC++ソースの次のところを修正すること。
jstring str = env->NewStringUTF("TestJNI OK");
jstring str = (*env)->NewStringUTF(env, "TestJNI C Base OK");
文字列は任意。
拡張子の変更とかも忘れずに。
by dairoku6 | 2008-06-18 00:49 | プログラム
<< びわゼリー JNI その1 >>



+0(+0)

by dairoku6
S M T W T F S
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
31
カテゴリ
タグ
りんく
ブログ:
ぽむぽむ
まるぶろぐ
以前の記事
検索
その他のジャンル
ファン
記事ランキング
ブログジャンル
画像一覧