我完全不了解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);


它就像一个魅力。但是根据平台的不同,由于导出的符号命名Linux .so和Windows .dll之间不匹配,我必须使用Rockey方法而不是rockey。我尝试使用以下方法在so文件中替换符号名称:perl -pi -e 's/rockey/Rockey/g' lib.so,但它不起作用(尽管已替换,但此后找不到符号'Rockey')。

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

最佳答案

根据JNA JavaDoc,您可以在初始化库时提供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,options);

09-25 22:19