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

Fer*_*ndo 6 java linux dll callback jna

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

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

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

import com.sun.jna.Callback;
interface IExternLibCallback extends Callback {..}
Run Code Online (Sandbox Code Playgroud)

这是我为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
  }
}
Run Code Online (Sandbox Code Playgroud)

谢谢,

费尔南多

Abh*_*ith 0

我会在 JNAWrapper 周围有另一个包装器。例如,如果调用了 dll 的 JNA 包装器,IExternLibWindows并且调用了 Linux 的包装器IExternLibLinux,我将编写另一个包装器 - IExternLib。然后,

 public interface IExternLibWindows extends StdCallLibrary{
  public IExternLibWindows Instance ;
 ...
   void stdcall_somefunc(...);
 ...
 }

 public interface IExternLibLinux extends StdCallLibrary{
  public IExternLibLinux Instance ;
 ...
   void cdecl_somefunc(...);
 ...
 }

 public class IExternLib(){

    public void somefunc(...){
        if(System.getProperty("os.name").startsWith("Windows"))
            IExternLibWindows.stdcall_somefunc(...);
        else if(System.getProperty("os.name").startsWith("Linux"))
            IExternLibLinux.cdecl_somefunc(...);

    }
 }
Run Code Online (Sandbox Code Playgroud)