【问题标题】:How to use JNA callback如何使用 JNA 回调
【发布时间】:2012-08-07 15:50:29
【问题描述】:

我正在使用 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 main:

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。 我的代码有什么问题?

感谢您的帮助!

【问题讨论】:

  • 请注意,C++ 中的eventCallback 被声明为__stdcall,因此Java 中的eventCallback 接口应该扩展JNA 的StdCallLibrary.StdCallCallback 接口,而不是直接扩展Callback 接口。此外,C++ 中的eventCallback 返回一个int,因此Java 中的eventCalllback.callback() 应该返回int 而不是boolean

标签: java callback jna


【解决方案1】:

C++ 与 C 不同。从你的 DLL (http://dependencywalker.com) 中转储符号,你会看到函数名(至少从链接器的角度来看)不是“setCallback ”。

使用extern "C" 避免对导出的函数进行名称修改,重命名您的Java 函数以匹配导出的链接器符号,或使用FunctionMapper 将Java 方法名称映射到链接器符号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 2015-05-10
    • 2012-12-12
    • 2011-10-19
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    相关资源
    最近更新 更多