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



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

C标题:

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已经可以实现的那样。

例如,我可以执行(对于Java到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("startn");
return width + height + offset;
}

目前在JNA库中似乎不可能

最新更新