3

Linux と Mac でライブラリを正常にコンパイルし、Java Native Access で使用しました。残念ながら、Visual Studio のコンパイラと Java Native Access では何も動作しないようです。

基本に戻って、Visual Studio で Java Native Access が動作する超単純な dll を作成しようとしています。

GimmeFiveDll.c は次のとおりです。

__declspec(dllexport) int gimmeFive()
{
    return 5;
}

SystemLibrary.java は次のとおりです。

import com.sun.jna.Native;


public class SystemLibrary {

public static final SystemLibrary instance = new SystemLibrary();

    static {
        Native.register("GimmeFiveDll");
    }

    public native int gimmeFive();
}

私はすでに Visual Studio で呼び出しインターフェイスを stdcall に切り替えようとしました。新しいプロジェクト ウィザードの空のプロジェクト dll win32 コンソールの既定値から他の変更を加えていません。上記の例では、結果の dll は に従って関数を正しくエクスポートしませんdumpbin.exe /exports。私の実際のプロジェクトはそれらを正しくエクスポートしますが、いずれにしても常に同じ JNA 例外が発生します。

Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'GimmeFiveDll': The specified module could not be found.

(はい、GimmeFiveDll.dll を System32 に入れました。はい、JNA を使用して、Windows に付属する System32 の他の dll にアクセスできます)。

JNAが好むVisual Studioによって作成されたDLLのこの最小限の例を完成させるのを手伝ってくれる人はいますか?

大変感謝します。

4

1 に答える 1

5

2日間壁に頭をぶつけた後、私はそれを理解しました. 問題は、C:\Windows\System32 がディレクトリ System.loadLibrary() (Native.register() が使用する) ではないことで、64 ビット マシンから dll をロードできます。代わりに、JNA は明らかにライブラリを一時的な場所にコピーしてロードしようとしましたが、失敗しました。「指定されたモジュールが見つかりませんでした」というメッセージはあまり役に立たず、間違った方向に進んでしまいました:-\

とにかく、私自身の質問に答えるために、Java(およびJNA)が使用できるMSVCで構築できるdllの例を示します(システムの正しいディレクトリに配置してください!):

GimmeFiveDll.c:

#ifdef __cplusplus
#error no C++, to keep this example simple
#endif

__declspec(dllexport) int gimmeFive()
{
    return 5;
}

DllTest.java:

import com.sun.jna.Native;

public class DllTest {

    static {
        Native.register("GimmeFiveDll");
    }

    public static native int gimmeFive();

    public static void main(String[] args) {
        System.out.println("I got: " + DllTest.gimmeFive());
    }
}

すべてがうまくいけば、Java は "I got: 5" を表示します。

stdcall を使用するようにコンパイラの設定を変更したり、関数シグネチャで __stdcall を宣言したりする必要があるとは思わなかったことに注意してください。実際、ウィザードが作成する通常の空の dll プロジェクトからコンパイラを変更する必要はありませんでした。

于 2010-03-11T22:08:06.223 に答える