如何使用JNA回调

2023-12-08

我正在使用 JNA 调用 dll 文件的函数。

简单DLL.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);
   };
}

简单DLL.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++ 与 C 不同。从 DLL (http://dependencywalker.com) 中转储符号,您将看到函数名称(至少从链接器的角度来看)不是“setCallback”。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用JNA回调 的相关文章

随机推荐

  • Silverlight tabchanged 事件 - tabcontrol

    我正在使用选项卡控件 并且我想处理 tabchanged 事件 我试图使用SelectionChanged没有运气的事件 它被触发太多次 加载选项卡控件或添加新选项卡后 我想仅当用户在选项卡之间导航时处理此事件 我找到了 WPF 的解决方案
  • VS2013 的开发者命令提示符在哪里?

    我需要从 Visual Studio 2013 中的开发人员命令提示符运行 web exe 文件 默认情况下 Visual Studio 2013 中未安装命令提示符 以前 我使用的是 Visual Studio 2012 它默认安装了开发
  • 迭代多个选择/文件夹项目

    我看了一眼MailItem并且没有看到任何表明我可以移动所选项目的信息 我有可以运行的代码 但是Set objItem GetCurrentItem 线路只接收一封邮件 我正在寻找ForEach通过文件夹 或者ForEach通过选择 我尝试
  • ClassCastException DataSource 无法转换为 javax.sql.ConnectionPoolDataSource

    我收到这个异常 java lang ClassCastException org apache tomcat jdbc pool DataSource cannot be cast to javax sql ConnectionPoolDa
  • 为什么使用“git rm”而不是“rm”来删除文件?

    在 SVN 上 直接从文件系统中删除某些内容 而不是使用 svn 会带来很多麻烦 我在使用时没有发现这是一个问题git 但我注意到 git 有它自己的rm执行 git rm 有什么区别rm and git rm 如果你只是使用rm 你需要跟
  • 画布宽度和高度均为 100% 时质量较差

    我用画布做了一个非常小的例子 它可以在JsFiddle http jsfiddle net yPtr5
  • 如何使用A*算法找到最佳的3条路线

    在 A 中 通常您得到的结果只是一条路径 对于给定的出发地和目的地 是否有可能根据 A 有 3 条推荐路径 所以第二个返回的是第二最佳路径 第三个返回的是第三最佳路径 我正在考虑也许以某种方式修改启发式以反映第二和第三最佳路径 你们觉得怎么
  • 填写特定工作表中多列中的空白单元格

    I have the following columns Score Name Last Name 5460 Name1 Lastname1 2620 340 470 3445 Name2 Lastname2 1290 1170 7460
  • 一键提交两份表格

    我有两种 HTML 表单 一种使用 PHP 在输入数据库时 提交数据 另一种将用户引导至 paypal 付款页面 我的问题是用户必须提交这两种表单 这当然是我不希望他们这样做的得做 有没有办法对两种表单使用一个提交按钮 欢迎使用 JavaS
  • 将 openCV 查找表 (LUT) 应用于图像

    我想申请定制颜色查找表 LUT 在图像上 我已经看过了openCV LUT Api但我似乎无法做对 bin bash coding utf 8 import os import numpy as np import cv2 b max 23
  • pty 终端数据包模式 TIOCPKT

    如果我启动一个终端 我如何知道它以什么模式启动 谁决定呢 我可以以数据包模式启动我的终端吗 TIOCPKT 我遇到了这个包模式链接说 Packet mode is enabled by pushing the pckt module on
  • UnicodeDecodeError,无效的连续字节

    为什么以下项目失败 为什么 latin 1 编解码器能够成功 o a test of xe9 char I want this to remain a string as this is what I am receiving v o de
  • 对类中变量的线程安全访问

    在可能有多个线程运行的应用程序中 并且不确定是否在多线程环境下访问这些方法的可能性 但为了安全起见 我做了一个测试类来演示一种情况 一种方法has被编程为线程安全 如果做得正确 也请发表评论 但其余的则不是 在这样的情况下 里面只有一行代码
  • 大 (> 4mb) 文件附件

    使用 Microsoft Graph API 可以将文件附件添加到消息中 如下所述here 但是 由于 REST 请求的总大小限制为 4mb 因此不允许包含非常大的附件 A 可恢复上传会话允许更大的上传 可以通过提供下载链接的参考附件进行引
  • 使用 Android Parse 的多个组合“或”查询

    在 Android 的 Parse 中 是否可以对多个 OR 子查询进行 AND 操作 我一直在尝试组合两个 OR 查询 但没有成功 根据我的研究 Parse 可能不具备这种能力 不过 我还没有找到任何东西来证实 否认这一点 例如 给定一堆
  • 如何使位图透明?

    param bitmap The source bitmap param opacity a value between 0 completely transparent and 255 completely opaque return T
  • Java 8 中方法引用的外部参数

    我希望将外部参数传递给方法引用 String prefix The number is numbers forEach Main printWithPrefix private static void printWithPrefix Int
  • 保护目录免遭直接 URL 访问

    需要一些帮助 我需要保护所有的FOLDERS in a DIRECTORY from direct URL使用权 我可以这样做吗 htaccess如果是 怎么办 或者他们是更安全的方法 这是我的情况 我允许用户上传 pdf 文件 文件发送至
  • MySQL - 组内计数器

    我想根据升序变量为组中的每一行添加一个计数器 我有一个解决方案 但如果组内的某些变量相等 它就不起作用 CREATE TABLE tb g CHAR 1 x INTEGER INSERT INTO tb g x VALUES a 1 a 2
  • 如何使用JNA回调

    我正在使用 JNA 调用 dll 文件的函数 简单DLL h typedef int stdcall eventCallback unsigned int id int value namespace test class hotas pu