ライブラリをロードしようとしたときに UnsatisfiedLinkError という例外が発生しました。ライブラリ ファイルを正しいパスに配置し、そのパスを PATH 環境変数に追加しました。しかし、何も機能していないようでした。Tomcat の構成を変更し、Java オプションに -Djava.library.path=C:\Windows\System32 を追加するまで。私の同僚の 1 人はこれを行う必要はありませんでしたが、彼女のシステムでは問題なく動作していました。誰でもこれに光を当てることができますか?
2 に答える
1つのオプションは、dllを登録することです
Regsvr32 “path to your dll.dll”.
これにより、dllがインストール/登録されます(dllであると想定しています)
しかし、COM dll の場合は、登録して System32 に配置する必要があることが一般的にわかりました。
JNI では、Java ネイティブ メソッドの名前と対応する C 関数の名前は同じではありません。C 関数を呼び出すには、C 関数の名前にプレフィックス「Java_」、クラス名、およびメソッド名を含める必要があります。簡単な方法は、プログラム「javah」を使用して、すべての定義を含むヘッダー ファイルを生成することです。
次の Windows の例を試してください: (Java クラス名は、対応するファイル名と同じでなければならないことに注意してください)
ステップ 1. 次の Java ファイル (P.java) を作成します。
class P
{
static
{
// "P" is the name of DLL without ".dll"
System.loadLibrary ("P");
}
public static native void f(int i);
public static void main(String[] args)
{
f(1);
}
}
ステップ 2. javac P.java
ステップ 3. javah P
次に、「javah」はヘッダーファイル「Ph」を生成します。
ステップ 4. 次の 2 行を含むファイル「P.def」を作成します (このファイルはエクスポートされたシンボルを定義します。この場合は C 関数の名前です)。
EXPORTS
Java_P_f
ステップ 5. C ファイルを作成します (PC):
#include "p.h"
JNIEXPORT void JNICALL Java_P_f(JNIEnv *env, jclass c, jint i)
{
printf("%i\n",i);
}
ステップ 6. Visual Studio コマンド プロンプト内で、次の変数を定義します。
JAVA_HOME = JDKのパスを設定します
set include=%include%;%JAVA_HOME%\include;%JAVA_HOME%\include\win32
ステップ 7. DLL を生成します。
cl /LD Pc P.def
ステップ 8. Java プログラムを実行します。
ジャワP
(注: P.dll と P.class は同じディレクトリにあります)