是否可以通过编程方式指定 JNA 回调?

Is is possible to specify a JNA callback programmatically?

我知道如何以常规方式指定 JNA 回调(C 到 Java),例如:

C header:

static void (*InvokerInst)(int, int);
__declspec(dllexport) int start();
__declspec(dllexport) void setInvoker(void (*InvokerInst)(int, int));

C 来源:

#include <stdio.h>
#include "main.h"
int start()
{
  InvokerInst(10, 10);
  return 0;
}
void setInvoker(void (*Invoker)(int, int)) {
   InvokerInst = Invoker;
}

Java图书馆界面:

public interface MyLibrary extends Library {
  int start();
  public void setInvoker(Invoker callback);
  public interface Invoker extends Callback {
     void invoke(int val1, int val2);
  }   
}

Java代码:

public class JNATest implements Invoker {
   private MyLibrary lib = null;

   public JNATest() {
      String path = System.getProperty("user.dir");
      NativeLibrary.addSearchPath("MyCLib", path);
      lib = (MyLibrary2)Native.load("MyCLib", MyLibrary.class);
      lib.setInvoker(this);
   }
   public void callStart() {
     String result = lib.start("TOTO");
     System.out.println("Result is: " + result);
  }     
  public static final void main(String[] args) {
     JNATest test = new JNATest();
     test.callStart();
  }
  public void invoke(int val1, int val2) {
     System.out.println("Value Invoked: " + (val1 + val2));
  }
}

这可行,但是是否可以在不定义 Java 接口的情况下执行相同的操作,就像在调用 C DLL 时使用 JNA 已经可以做到的那样。

比如我可以执行(for Java to C)(假设我们在user.dir目录下有一个MyCLib.dll库):

  String path = System.getProperty("user.dir");
  NativeLibrary.addSearchPath("MyCLib", path);
  lib = NativeLibrary.getInstance("MyCLib"); 

  Function function = lib.getFunction("start");
  Object[] array = new Object[3];
  array[0] = 1f;
  array[1] = 1f;
  array[2] = 10f;
  Object result = function.invoke(Float.class, array);
  System.out.println(result);

使用以下 C 代码:

float start(float width, float height, float offset)
{
  printf("start\n");
  return width + height + offset;
}

JNA库里好像暂时不行