- PR -

Cで作ったDLL中の関数をJava(Servlet)からCallしたいですが

投稿者投稿内容
ふうた
大ベテラン
会議室デビュー日: 2001/08/23
投稿数: 198
お住まい・勤務地: 岡山
投稿日時: 2001-11-22 11:04
正直ちょっと分からないですが、下記に参考になるものはないでしょうか?

http://java-house.etl.go.jp/ml/search/SSE/cgi-bin/search.pl?query=UnsatisfiedLinkError+JNI&level=Standard
isseki
大ベテラン
会議室デビュー日: 2001/11/05
投稿数: 107
投稿日時: 2001-11-22 17:27
ふうたさん
ご返事ありがとうございます。
Javaソースの
"package doplayer;"を外したらうまく行きました。

あるpackageに属する*.classからDLLをCALLするために
package名と
JAVAを実行するカレントディレクトリと
DLLの置き場との間の正しい位置関係は
まだ見つかっていません。
(カレントディレクトリとpackage名との色々な組み合わせを
やって見ましたがけれども…)
ーーーーーーーーーーーーーーーーーーーーーー
上野
ふうた
大ベテラン
会議室デビュー日: 2001/08/23
投稿数: 198
お住まい・勤務地: 岡山
投稿日時: 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
isseki
大ベテラン
会議室デビュー日: 2001/11/05
投稿数: 107
投稿日時: 2001-11-24 17:52
ふうたさん
いつもお世話になっております。
ご指導の下で原因は完全に究明できました。
JAVAHで生成したDLL関数名(プロトタイプ)には自動的にパッケージ名を
付加してくれないのはNative関数名が見つからない原因だったんです。
このためにJAVAHを使う時に必ず必要のパッケージ命を*.class名の前に
明確に指定しなければなりません。
例:
javah pak1.pak2.XXXX
注意:
@パッケージ命の中に'-'などの符号があれば複数の英数に変換されるのに要注意!
Ajavahによってどんなプロトタイプの関数名を生成されてもC++のコンパイラー
 エラーにはならないが、DLL関数名とjavahに生成した関数名まったく一致しなければ
 ならない(あたりまえ)。

みなさんありがとうございました。
ーーーーーーーーーーーーーーーーーーーー
上野
NunoB
会議室デビュー日: 2003/09/09
投稿数: 1
投稿日時: 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でのみエラーが発生する理由は何でしょうか・・・?
何か情報がありますでしょうか?

スキルアップ/キャリアアップ(JOB@IT)