Java 在接口中提供不同的方法名称

Java 在接口中提供不同的方法名称,java,shared-libraries,jna,Java,Shared Libraries,Jna,我完全不懂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=

我完全不懂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之间导出的符号命名不匹配。我尝试使用:
perl-pi-e's/rockey/rockey/g'lib替换so文件中的符号名。so
但它不起作用(尽管进行了替换,但之后找不到符号“rockey”)

所以我的问题是,如何以最简单的方式(而不是最漂亮的方式)通过编程解决这个问题。非常感谢

根据,您可以在初始化库时提供一个选项,将方法名称映射到库名称

FunctionMapper mapper = new FunctionMapper() {
    public String getFunctionName(NativeLibrary library, Method method) {
    if (Platform.isWindows()) {
        if (method.getName().equals("rocket")) {
            return "Rocket";
        }
    }
    return method.getName();
} }; Map options=newhashmap(); options.put(Library.OPTION\函数\映射器,映射器); Native.loadLibrary(“rocket”,rocket.class,options)

根据,您可以在初始化库时提供一个选项,将方法名称映射到库名称

FunctionMapper mapper = new FunctionMapper() {
    public String getFunctionName(NativeLibrary library, Method method) {
    if (Platform.isWindows()) {
        if (method.getName().equals("rocket")) {
            return "Rocket";
        }
    }
    return method.getName();
} }; Map options=newhashmap(); options.put(Library.OPTION\函数\映射器,映射器);
Native.loadLibrary(“rocket”,rocket.class,options)

在这种情况下,您可能不希望尝试控制从库导出的符号的大小写。为什么不检查您正在运行的操作系统并进行相应的调用?请看,您可以尝试使用反射,例如,根据操作系统的不同,您可以在
JRockey4ND.class
中查找方法“rockey”或“rockey”。谢谢@Thomas,听起来很不错。但是我应该如何修改我的接口,使它能够同时提供这两种方法呢?我不能直接在接口体中检查操作系统。嗯,我可能不会更改接口,而是检查
loadLibrary
调用返回的实现类,即使用
rockey.getClass()
获取它。然后使用
getMethod(“rockey”),获得小写方法。如果它不存在,即您得到一个
MethodNotFoundException
,请尝试使用方法名
“Rockey”
。但是,问题是我有一段时间没有使用JNA,所以我不知道如果方法名不合适,是否可以加载库。如果是这样的话,那么您最好解决这个案例问题。
Rockey
是第三方库吗?如果是,是否有方法在符号生成/导出期间重新编译并更改名称?如果没有,您可以尝试编写一个适配器,以正确的大小写提供方法名称,并将调用委托给实际的库。在这种情况下,您可能不想尝试控制从库导出的符号的大小写。为什么不检查您正在运行的操作系统并进行相应的调用?请看,您可以尝试使用反射,例如,根据操作系统的不同,您可以在
JRockey4ND.class
中查找方法“rockey”或“rockey”。谢谢@Thomas,听起来很不错。但是我应该如何修改我的接口,使它能够同时提供这两种方法呢?我不能直接在接口体中检查操作系统。嗯,我可能不会更改接口,而是检查
loadLibrary
调用返回的实现类,即使用
rockey.getClass()
获取它。然后使用
getMethod(“rockey”),获得小写方法。如果它不存在,即您得到一个
MethodNotFoundException
,请尝试使用方法名
“Rockey”
。但是,问题是我有一段时间没有使用JNA,所以我不知道如果方法名不合适,是否可以加载库。如果是这样的话,那么您最好解决这个案例问题。
Rockey
是第三方库吗?如果是,是否有方法在符号生成/导出期间重新编译并更改名称?如果没有,您可以尝试编写一个适配器,以正确的大小写提供方法名称,并将调用委托给实际的库。