2014-02-23 103 views
1

我有一個簡單的問題,但我找不到答案;/ 如何在java項目中創建和調用匯編程序庫? 我發現這樣的調用創建的庫:如何添加asm庫到java項目?

public class Hello { 
    public static void main(String[] args) { 
      System.out.println("start"); 

      System.loadLibrary("native"); 
      (new Hello()).nativeCode(); 

      System.out.println("stop"); 
    } 

    public native void nativeCode(); 

}

,但解決方案來創建庫是基於Linux,所以我無法弄清楚如何做到這一點就贏7 64位。 你有什麼想法嗎?感謝您的建議。

+0

使用符合cdecl調用約定的JNI-comliant函數在程序集中構建一個DLL。一旦啓用「masm」定製,Visual Studio可以幫助您。 –

回答

2

從Java調用本地代碼是使用JNI完成的。您需要編寫一個Java類,其中包含使用native關鍵字聲明的方法,並且在您的本機庫中,您需要包含一個相應的函數以及適合JVM調用的名稱和參數。由於JVM調用的本地函數需要在C頭文件jni.h中定義類型的參數,並且您通過調用在同一頭文件中聲明的C函數與JVM進行交互,所以您可能會發現最簡單的方法是編寫一些C(或C++)代碼作爲JVM和彙編代碼之間的中介。

如何真正構建本地庫的細節是平臺特定的,但不是Java特定的;在Windows上,Java的System.loadLibrary()只是加載普通的DLL文件。您的編譯器/彙編程序文檔應提供有關如何構建一個的信息。

+0

[JNA](http://en.wikipedia.org/wiki/Java_Native_Access)呢?它會更好嗎?我沒有任何經驗,我只是好奇... – Katona

+0

@卡託納,我沒有使用JNA,甚至沒有聽說過它現在。它看起來像是將Java類型映射到本地類型,這有助於調用未專門編寫的本機函數以便從Java調用。儘管這是以效率爲代價的:例如,將字符串傳遞給本地函數可能涉及將其複製到本機堆,並將其轉換爲C風格的字符串,而不是將本地代碼調用到JNI函數直接訪問Java堆上的字符數據。 – Wyzard