3

私はJavaが初めてで、Googleとstackoverflowでこの質問を検索し、いくつかの投稿を見つけましたが、それでも理解できません。

Java から DLL ライブラリ (C++) メソッドを使用したいと考えています。この目的のためにJNAを使用します。JNA は私のライブラリを見つけましたが、私のメソッドを見つけることができません: Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function 'LoadCurrentData': The specified procedure could not be found.

私のコード:

package javaapplication1;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
import com.sun.jna.Pointer;

public class JavaApplication1 {

    public interface LibPro extends Library {
        LibPro INSTANCE = (LibPro) Native.loadLibrary(
            (Platform.isWindows() ? "LibPro" : "LibProLinuxPort"), LibPro.class);

        public  short LoadCurrentData();
    }

    public static void main(String[] args) {
      LibPro sdll = LibPro.INSTANCE;
      sdll.LoadCurrentData();  // call of void function
    }
 }

Depency Walker Tool を使用して DLL を調べたところ、関数名に接頭辞と接尾辞が付いていることがわかりました。_LoadCurrentData@0

返信ありがとうございます。

PS http://tutortutor.ca/cgi-bin/makepage.cgi?/articles/rjna (リスト 6) で動作する良い例を見つけました。

4

1 に答える 1

3

関数名がマングルされていることに気付いたので、正しい名前マッパーを適用する必要があると思いCallMapperます。コンパイラと同じマングリングを実装するように登録する必要があります。

これは、 JNAホームページからのrevelantエントリです。

ダンプ ユーティリティを使用して、エクスポートされた関数の名前を調べて、それらが一致していることを確認します (Linux では nm、Windows によって異なります)。Windows では、関数に "@NN" の形式の接尾辞が付いている場合、ライブラリ インターフェイスを初期化するときに StdCallFunctionMapper をオプションとして渡す必要があります。一般に、関数マッパー (FunctionMapper) を使用してルックアップされたメソッドの名前を変更したり、呼び出しマッパー (InvocationMapper) を使用してメソッド呼び出しをより広範囲に制御したりできます。

ここにおそらく関連性のある質問があります: StdCallFunctionMapperを使用して JNA で DLL 関数の名前を変更する

于 2013-01-13T15:10:03.573 に答える