如何在.dll和.so中使用JNA与相同的回调签名
发布时间:2020-12-14 02:26:19 所属栏目:Windows 来源:网络整理
导读:我正在研究一个在 Windows和 Linux上运行的java项目,我正在使用第三方共享库,这两个操作系统可以使用相同的方法签名.但是,dll的调用约定是stdcall,而共享对象是cdecl. 我想避免重复回调代码,两个接口和两个类,每个调用约定一个接口.我想为回调函数编写一个代
我正在研究一个在
Windows和
Linux上运行的java项目,我正在使用第三方共享库,这两个操作系统可以使用相同的方法签名.但是,dll的调用约定是stdcall,而共享对象是cdecl.
我想避免重复回调代码,两个接口和两个类,每个调用约定一个接口.我想为回调函数编写一个代码.那可能吗? 在linux下访问.so的代码中唯一的变化是接口.回调函数代码本身是相同的.我会感激任何消化. import com.sun.jna.Callback; interface IExternLibCallback extends Callback {..} 这是我为dll中的回调编写的代码: //Interface to stdcall (Windows) package test1; import com.sun.jna.win32.StdCallLibrary; interface IExternLibCallback extends StdCallLibrary.StdCallCallback { void callback (JEventDataStructure context_data); } //Class that implements the interface package test1; class ExternLibCallback implements IExternLibCallback { ... Other class codes go here .... @ Override public void callback (JEventDataStructure contextData) { ... Code of callback function } } 谢谢, 费尔南多 解决方法
您可以使用StdCallLibrary / StdCallCallback声明它们,但可能无法在所有平台上定义行为.在不支持备用调用约定的平台上忽略该选项(此时除了win32之外的所有内容),但未必在所有平台上进行测试.
这是首选定义,它仅为windows定义stdcall库. interface MyLibrary extends Library { interface MyCallback extends Callback { public void invoke(); } void callbackFunction(MyCallback cb); MyLibrary INSTANCE = (MyLibrary)Native.loadLibrary("mylib",Platform.isWindows() ? MyWin32Library.class : MyLibrary.class); } interface MyWin32Library extends MyLibrary,StdCallLibrary { interface MyStdCallCallback extends MyCallback,StdCallCallback {} void callbackFunction(MyStdCallCallback cb); } 如果你只是针对linux和windows,那么单个界面就足够了(不过我建议测试一下): interface MyLibrary extends StdCallLibrary { interface MyCallback extends StdCallCallback { public void invoke(); } void callbackFunction(MyCallback cb); MyLibrary INSTANCE = (MyLibrary)Native.loadLibrary("mylib",MyLibrary.class); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- libevent,windows和.NET编程
- Windows 10 系统优化脚本大全
- windows – 无法升级SVN工作副本
- windows-server-2008 – 如何监控Windows进程的工作集大于4
- windows-server-2012-r2 – WSUS数据库使用大量内存,如何优
- windows-phone-7 – 是否可以在Windows Phone应用程序提交中
- windows-vista – 如何在Windows Vista Home Edition上授予
- wmi – 在Win8上发现并启用/禁用设备?
- Windows 7:在没有打印服务器的情况下部署打印机设置
- windows-phone-7 – 如何在模拟器中没有Internet连接条件下