加入收藏 | 设为首页 | 会员中心 | 我要投稿 东莞站长网 (https://www.0769zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

如何在.dll和.so中使用JNA与相同的回调签名

发布时间:2021-01-14 20:28:43 所属栏目:Linux 来源:网络整理
导读:我正在研究一个在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);
}

(编辑:东莞站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读