Linux   发布时间:2022-05-08  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何在.dll和.so中使用JNA与相同的回调签名大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

我正在研究一个在Windows和Linux上运行的java项目,我正在使用第三方共享库,这两个操作系统可以使用相同的方法签名.但是,dll的调用约定是stdcall,而共享对象是cdecl.

我想避免重复回调代码,两个接口和两个类,每个调用约定一个接口.我想为回调函数编写一个代码.那可能吗?

在linux下访问.so的代码中唯一的变化是接口.回调函数代码本身是相同的.我会感激任何消化.

@H_674_8@import com.sun.jna.CallBACk; interface IExternLibCallBACk extends CallBACk {..}

这是我为dll中的回调编写的代码:

@H_674_8@//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库.

@H_674_8@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,那么单个界面就足够了(不过我建议测试一下):

@H_674_8@interface MyLibrary extends StdCallLibrary { interface MyCallBACk extends StdCallCallBACk { public void invoke(); } void callBACkFunction(MyCallBACk cb); MyLibrary INSTANCE = (MyLibrary)Native.loadLibrary("mylib",MyLibrary.class); }

大佬总结

以上是大佬教程为你收集整理的如何在.dll和.so中使用JNA与相同的回调签名全部内容,希望文章能够帮你解决如何在.dll和.so中使用JNA与相同的回调签名所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: