是否可以通过编程方式指定 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库里好像暂时不行
我知道如何以常规方式指定 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库里好像暂时不行