1

JNAを使用してdllファイルの関数を呼び出しています。

simpleDLL.h:

typedef int (__stdcall *eventCallback)(unsigned int id, int value);

namespace test
{
   class hotas
   {
   public:
   static __declspec(dllexport) int readValue(int a);
   static __declspec(dllexport) void setCallback(eventCallback evnHnd);
   };
}

simpleDLL.cpp:

#include "simpleDLL.h"
#include <stdexcept>
using namespace std;

namespace test
{
    eventCallback callback1 = NULL;
int test::readValue(int a)
{
    return 2*a;
}

void test::setCallback(eventCallback evnHnd)
{
    callback1 = evnHnd;
}  
}

私のJavaインターフェースは次のようになります。

public interface DLLMapping extends Library{

DLLMapping INSTANCE = (DLLMapping) Native.loadLibrary("simpleDLL", DLLMapping.class);

int readValue(int a);

public interface eventCallback extends Callback {

    boolean callback(int id, int value);
}

public void setCallback(eventCallback evnHnd);
}

そして最後に Java メイン:

public static void main(String[] args) {

    DLLMapping sdll = DLLMapping.INSTANCE;

    int a = 3;
    int result = sdll.readValue(a);
    System.out.println("Result: " + result);

    sdll.setCallback(new eventCallback(){
        public boolean callback(int id, int value) {
            //System.out.println("bla");
            return true;
        }
    });
}

私の問題は、Javaが関数setCallbackを見つけられないというエラーが発生したことです。コードの何が問題になっていますか?

ご協力ありがとうございました!

4

1 に答える 1

4

C++ は C と同じではありません。DLL (http://dependencywalker.com) からシンボルをダンプすると、(少なくともリンカーの観点から) 関数名が「setCallback」ではないことがわかります。

エクスポートされた関数の名前マングリングを回避するために使用extern "C"し、エクスポートされたリンカー シンボルに一致するように Java 関数の名前を変更するか、FunctionMapper を使用して Java メソッド名をリンカー シンボルにマップします。

于 2012-08-08T05:22:34.747 に答える