大佬教程收集整理的这篇文章主要介绍了如何在.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
}
}
谢谢,
费尔南多
这是首选定义,它仅为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,请注明来意。