- PR -

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

投稿者投稿内容
isseki
大ベテラン
会議室デビュー日: 2001/11/05
投稿数: 107
投稿日時: 2001-11-20 12:33
お世話になっております。

すでに存在している Cで作ったDLL(Win2000)中の関数を
~~~~~~~~~~~~~~~~~
Java(Servlet)からCallしたいですが
どんな方法ありますか。

宜しくお願いします。

上野
H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2001-11-20 16:18
Javaで外部命令の実行で説明されているように、java.lang.Runtimeクラスを使えばできるのではないでしょうか。

Servletでも実際には普通のJavaプログラムなのでできると思いますよ。
ふうた
大ベテラン
会議室デビュー日: 2001/08/23
投稿数: 198
お住まい・勤務地: 岡山
投稿日時: 2001-11-20 19:37
DLLの関数を使うということであれば、JNIを使うのが自然でしょう。

http://www.pigumer.gr.jp/JNISample.html
H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2001-11-20 21:01
あ、ごめんなさい。DLLでしたね。外部関数と間違えてました。
miki
大ベテラン
会議室デビュー日: 2001/09/21
投稿数: 174
お住まい・勤務地: 東京都八王子市
投稿日時: 2001-11-21 09:43
JNI以外の方法を考えてみます。
関数が単純で頻度も低いなら、exeでラップしてRuntime#execというのも現実的だと思います。
C/C++でCORBAオブジェクトを作って、そこからdllを呼び出すというのも考えられます。
WebサーバがIISならWebサービス経由でCOMを呼び出すという手もあるかもしれません。


isseki
大ベテラン
会議室デビュー日: 2001/11/05
投稿数: 107
投稿日時: 2001-11-21 19:42
みなさんこんばんわ
ほんとうにお世話になっております。

JNIを使って見ましたが
何故か
Java ApplicaionからC++で造ったDLL中の関数をCallしようたしたら
「適当なNative関数を見つからない」エラーが発生しました。
本を調べたが原因はまだ分かっていません。
(Win200コマンドプロンプトにてこのDLLファイルの存在場所をpathにsetしていますし)

ご存知の方ヒントを下さいませんか。


/****** Java code ********/
package doplayer;

class HelloWorld {
public native void displayHelloWorld();

static {
System.loadLibrary("hello");

}

public static void main(String[] args) {
new HelloWorld().displayHelloWorld();
}
}


/****** C++ DLL code ********/

#include "stdafx.h"
#include "HelloWorld.h"
#include <stdio.h>


BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved )
{
return TRUE;
}

JNIEXPORT void JNICALL
Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
{
printf("Hello world!\n");
return;
}

// ↑で生成したhello.dllを二つのディレクトリにCopyし(ファイルとディレクトリの構成は↓に示している通り)
// Win200コマンドプロンプトにてこのディレクトリをカレントディレクトリにして

H:\DLL\doplayer\HelloWorld.class
H:\DLL\doplayer\hello.dll
H:\hello.dll

/////////////////実行メッセージ:
H:\DLL>java doplayer/HelloWorld
Exception in thread "main" java.lang.UnsatisfiedLinkError: displayHelloWorld
at doplayer.HelloWorld.displayHelloWorld(Native Method)
at doplayer.HelloWorld.main(HelloWorld.java:23)


ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

Kawabe
isseki
大ベテラン
会議室デビュー日: 2001/11/05
投稿数: 107
投稿日時: 2001-11-21 19:53
ごめんなさい
先のディレクトリの構成を訂正します。
誤:
H:DLLdoplayerHelloWorld.class
H:DLLdoplayerhello.dll
H:hello.dll

正:
H:DLL\doplayer\HelloWorld.class
H:DLL\doplayer\hello.dll
H:DLL\hello.dll

ーーーーーーーーーーーーーーーーーーーーーー
上野
isseki
大ベテラン
会議室デビュー日: 2001/11/05
投稿数: 107
投稿日時: 2001-11-21 19:56
ごめんなさい
先のディレクトリの構成を再訂正します
(度々申し訳ございません一つの'\\'が表示できなかったので)。
誤:
H:DLLdoplayerHelloWorld.class
H:DLLdoplayerhello.dll
H:hello.dll

正:
H:DLL/doplayer/HelloWorld.class
H:DLL/doplayerhello.dll
H:DLL/hello.dll

ーーーーーーーーーーーーーーーーーーーーーー
上野

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