2013-12-20 145 views
2

使用Java和JNA庫,我想訪問商業DLL文件(C#)中的靜態方法。如何訪問靜態方法?

不幸的是,Java 7不允許在一個接口中使用靜態方法,雖然Java 8會對此進行修改,但最新的beta版本顯得無關緊要。

建議/更正是受歡迎的(我是JNA的新手,並且正在避免JNI),並且我已經使用Javonet來確認方法簽名。

import com.sun.jna.Library; 
import com.sun.jna.Native; 

public class INeedHelp { 
    public interface MyInterface extends Library { 
     public static boolean isDisconnected(); //Mirror of C# method signature, but wont work 
     public boolean isDisconnected(); //best fit, but throws exception "Error looking up function 'isDisconnected': The specified procedure could not be found." 
    } 

    public static void main(String[] args) { 
     MyInterface anInstance = (MyInterface) Native.loadLibrary("theDLL", MyInterface.class); 
     anInstance.isDisconnected(); 
    } 
} 

回答

1

你應該可以使用Direct Mapping,就像;

import com.sun.jna.*; 

public class MyClass { 

    public static native boolean isDisconnected(); 

    static { 
     Native.register("theDLL"); 
    } 

    public static void main(String[] args) { 
     MyClass.isDisconnected(); 
    } 
} 
+0

我知道這是不相關的問題,但你能解釋什麼'靜態{ Native.register(「theDLL」)做'static'; }'做? – vikingmaster

+0

@Jari這是一個[靜態初始化塊](http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html),它將在首次初始化類類型時由JVM運行。換句話說,在任何代碼可以調用或使用該類之前,它將始終由JVM運行。 –

+0

哦,它就像一個靜態的構造函數?真棒 – vikingmaster