2016-03-01 20 views
0

我完全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替換此文件中的符號名稱,但它不起作用(即使替換,此後仍無法找到'Rockey'符號)。

所以我的問題是,如何以最簡單的方式(不是最漂亮的)以編程方式解決這個問題。非常感謝!

+0

在這種情況下,您可能不希望試圖控制從庫導出的符號的大小寫。爲什麼不檢查你正在運行的操作系統並進行適當的調用?請參閱http://stackoverflow.com/questions/228477/how-do-i-programmatically-determine-operating-system-in-java –

+1

您可以嘗試使用反射,例如根據操作系統的不同,在JRockey4ND.class中查找「rockey」或「Rockey」方法。 – Thomas

+0

謝謝@Thomas,聽起來非常好。但是,我應該如何修改我的界面,以便能夠提供兩種方法?我不能直接在界面主體中檢查OS。 – pikkewyn

回答

2

根據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(); 

} }; Map options = new HashMap(); options.put(Library.OPTION_FUNCTION_MAPPER,mapper); Native.loadLibrary(「rocket」,Rocket.class,options);

相關問題