在接口中提供不同的方法名称
Provide different method name in interface
我完全Java一无所知,但我必须解决这个问题。我正在使用 JNA 并在一个文件中:
public interface JRockey4ND extends Library {
public short rockey(short func, short[] handle, int[] lp1, int[] lp2, short[] p1, short[] p2, short[] p3, short[] p4, byte[] buffer);
public short RY_FIND=1;
public short RY_FIND_NEXT=2;
}
在另一个文件中:
JRockey4ND rockey = (JRockey4ND) Native.loadLibrary(libFileName, JRockey4ND.class);
.
.
retval=rockey.rockey(rockey.RY_FIND,handle[0],lp1,lp2,p1,p2,p3,p4,buffer);
它就像一个魅力。但根据平台,我必须使用 Rockey
方法而不是 rockey
,因为 Linux .so 和 Windows .dll 之间的导出符号命名不匹配。我尝试使用以下方法替换 so 文件中的符号名称:perl -pi -e 's/rockey/Rockey/g' lib.so
但它不起作用(之后找不到符号 'Rockey',尽管进行了替换)。
所以我的问题是,如何以最简单的方式(不是最漂亮的方式)以编程方式解决这个问题。非常感谢!
根据 JNA JavaDoc, you can provide a FunctionMapper
作为初始化库时的一个选项,它将方法名称映射到库名称。
FunctionMapper mapper = new FunctionMapper() {
public String getFunctionName(NativeLibrary library, Method method) {
if (Platform.isWindows()) {
if (method.getName().equals("rocket")) {
return "Rocket";
}
}
return method.getName();
}
};
映射选项 = new HashMap();
options.put(Library.OPTION_FUNCTION_MAPPER, 映射器);
Native.loadLibrary("rocket", Rocket.class, 选项);
我完全Java一无所知,但我必须解决这个问题。我正在使用 JNA 并在一个文件中:
public interface JRockey4ND extends Library {
public short rockey(short func, short[] handle, int[] lp1, int[] lp2, short[] p1, short[] p2, short[] p3, short[] p4, byte[] buffer);
public short RY_FIND=1;
public short RY_FIND_NEXT=2;
}
在另一个文件中:
JRockey4ND rockey = (JRockey4ND) Native.loadLibrary(libFileName, JRockey4ND.class);
.
.
retval=rockey.rockey(rockey.RY_FIND,handle[0],lp1,lp2,p1,p2,p3,p4,buffer);
它就像一个魅力。但根据平台,我必须使用 Rockey
方法而不是 rockey
,因为 Linux .so 和 Windows .dll 之间的导出符号命名不匹配。我尝试使用以下方法替换 so 文件中的符号名称:perl -pi -e 's/rockey/Rockey/g' lib.so
但它不起作用(之后找不到符号 'Rockey',尽管进行了替换)。
所以我的问题是,如何以最简单的方式(不是最漂亮的方式)以编程方式解决这个问题。非常感谢!
根据 JNA JavaDoc, you can provide a FunctionMapper
作为初始化库时的一个选项,它将方法名称映射到库名称。
FunctionMapper mapper = new FunctionMapper() {
public String getFunctionName(NativeLibrary library, Method method) {
if (Platform.isWindows()) {
if (method.getName().equals("rocket")) {
return "Rocket";
}
}
return method.getName();
} }; 映射选项 = new HashMap(); options.put(Library.OPTION_FUNCTION_MAPPER, 映射器); Native.loadLibrary("rocket", Rocket.class, 选项);