4

C++ で記述されたライブラリ (実際には Firefox プラグイン xyz.dll) があり、Java からそのメソッドにアクセスする必要があります。

public class AccessLibrary {
    public interface Kernel32 extends Library {
        public void showVersion();
    }

    public static void main(String[] args) {
        Kernel32 lib = (Kernel32) Native.loadLibrary("xyz.dll", Kernel32.class);
        lib.showVersion();
    }
}

実行中に次のエラーが発生しました。

java -jar dist/accessLibrary.jar
Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function  'showVersion': The specified procedure could not be found.

ネイティブ ライブラリのソース コードでは、メソッドは次のように定義されています。

void CPlugin::showVersion() {
    /* ... */
}

私はJavaが初めてです。何か基本的なことが欠けているかもしれません。同様の質問を調べましたが、どれも私の問題を解決しません。

Windows 7 64bit と Java 7 を使用していることを忘れていました。

4

2 に答える 2

2

まず、クラス メソッドをエクスポートして Java にロードすることはできません。名前がめちゃくちゃになり、Java はそれを正しく呼び出す方法を知りません。あなたがする必要があるのは、それを独自の別の関数に分割することです。

その後:

すでに指摘したように、必ず関数をエクスポートしてください。2 つの方法のいずれかを使用してエクスポートできます。最初に言及されているのは、__declspec( dllexport ) を使用することです。2 つ目は、def ファイルに入れることです。

さらに、必ず extern "C" としてマークしてください。そうしないと、名前が壊れてしまいます。詳細はすべてここにあります: dllexport を使用して DLL から関数をエクスポートする

したがって、署名は次のようになります。

extern "C" __declspec(dllexport) void showVersion () {
}

最後に、依存ツールはhttp://www.dependencywalker.com/からダウンロードできます。

于 2013-02-09T09:28:51.087 に答える
1

たとえば、ネイティブライブラリはCスタイルのインターフェースを提供する必要があると思います

__declspec( dllexport ) void showVersion() {
  /* ... */
}

理想的には、depends.exe(Windows SDK から入手できる) を使用して DLL を確認すると、DLL が正しい関数エクスポートを提供しているかどうかがわかります。

于 2013-02-05T14:18:10.023 に答える