我正在研究一个在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);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。