Как использовать JNA в .dll и .so с той же сигнатурой обратного вызова

Я работаю над java-проектом для запуска как в Windows, так и в Linux, и я использую стороннюю разделяемую библиотеку, доступную для обеих операционных систем с одинаковой сигнатурой методов. Но соглашение о вызовах dll - это stdcall, а общий объект - cdecl.

Я бы хотел избежать дублирования кода обратного вызова, двух интерфейсов и двух классов, по одному интерфейсу для каждого соглашения о вызовах. Я хотел бы написать единый код для функции обратного вызова. Возможно ли это?

Единственное изменение в приведенном ниже коде для доступа к .so в linux - это интерфейс. Сам код функции обратного вызова такой же. Буду признателен за любые предложения.

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
  }
}

Спасибо,

Фернандо

6
задан Fernando 2 June 2011 в 20:17
поделиться