- - PR -
Cで作ったDLL中の関数をJava(Servlet)からCallしたいですが
| 投稿者 | 投稿内容 |
|---|---|
|
投稿日時: 2001-11-22 11:04
正直ちょっと分からないですが、下記に参考になるものはないでしょうか?
http://java-house.etl.go.jp/ml/search/SSE/cgi-bin/search.pl?query=UnsatisfiedLinkError+JNI&level=Standard |
|
投稿日時: 2001-11-22 17:27
ふうたさん
ご返事ありがとうございます。 Javaソースの "package doplayer;"を外したらうまく行きました。 あるpackageに属する*.classからDLLをCALLするために package名と JAVAを実行するカレントディレクトリと DLLの置き場との間の正しい位置関係は まだ見つかっていません。 (カレントディレクトリとpackage名との色々な組み合わせを やって見ましたがけれども…) ーーーーーーーーーーーーーーーーーーーーーー 上野 |
|
投稿日時: 2001-11-22 21:19
パッケージ化する場合は、ネイティブメソッドの関数名もあわせて変更する必要があるようです。
http://java-house.etl.go.jp/ml/archive/j-h-b/026614.html#body http://java.sun.com/products/jdk/1.2/ja/docs/ja/guide/jni/spec/jniTOC.doc.html |
|
投稿日時: 2001-11-24 17:52
ふうたさん
いつもお世話になっております。 ご指導の下で原因は完全に究明できました。 JAVAHで生成したDLL関数名(プロトタイプ)には自動的にパッケージ名を 付加してくれないのはNative関数名が見つからない原因だったんです。 このためにJAVAHを使う時に必ず必要のパッケージ命を*.class名の前に 明確に指定しなければなりません。 例: javah pak1.pak2.XXXX 注意: @パッケージ命の中に'-'などの符号があれば複数の英数に変換されるのに要注意! Ajavahによってどんなプロトタイプの関数名を生成されてもC++のコンパイラー エラーにはならないが、DLL関数名とjavahに生成した関数名まったく一致しなければ ならない(あたりまえ)。 みなさんありがとうございました。 ーーーーーーーーーーーーーーーーーーーー 上野 |
|
投稿日時: 2003-09-09 17:27
いつも、興味深い話題で楽しませて頂いております。
JNIでCOBOLのDLLを呼ぶプログラムを書いている最中に、このスレッドを見つけたので書き込んで見ました。 パッケージ名を使わず、以下通常のJNIソースを作成しました。 【Test01.java】 public class Test01 { public native String loginCheck(String login); static { System.loadLibrary("Test01"); } public static void main( String[] args ) { Test01 ex = new Test01(); String name = ex.loginCheck(args[0]); } } 【Test01.c】 #include "Test01.h" #include "libcob.h" extern int Test01sub (char *, char *); void sub_copy_const(const char *from, char *to,int length){ ・・・省略… } JNIEXPORT jstring JNICALL Java_Test01_loginCheck(JNIEnv *env, jobject obj, jstring jlogin) { jboolean *result; char userid[11]; char username[11]; char uUsername[20]; jstring jusername; int ret; const char *login = (*env)->GetStringUTFChars(env,jlogin,0); sub_copy_const(login,userid,11); cob_init(0,NULL); ret = Test01sub(userid,username); username[10]='\0'; jusername = (*env)->NewStringUTF(env,username); return jusername; } 【Test01sub.cob】 IDENTIFICATION DIVISION. PROGRAM-ID. Test01sub. ENVIRONMENT DIVISION. DATA DIVISION. LINKAGE SECTION. 01 USERID PIC X(10). 01 USERNAME PIC X(10). PROCEDURE DIVISION USING USERID USERNAME. M-000. IF USERID = "TOKYO" MOVE "太郎" TO USERNAME ELSE MOVE "見知人" TO USERNAME END-IF. M-999. EXIT PROGRAM. ところが、このプログラムを、JDKでコンパイルして動作させてみたところ、 JDK1.4.2で、 java.lang.UnsatisfiedLinkError: が発生してしまいます。 JDK1.3、JDK1.4.0、JDK1.4.1では、正常に動作しました。 COBOLコンパイラは、OpenCOBOLです。 JDK1.4.2でのみエラーが発生する理由は何でしょうか・・・? 何か情報がありますでしょうか? |
