1. JNI一文詳解
全篇內容詳細介紹了JNI(java Native Interface)的使用方法,用於在Java代碼中調用非Java代碼,主要繞過Java的內存管理和解決性能問題。以下為詳細步驟:
第一步:理解JNI基礎。JNI是Java Native Interface的縮寫,它允許Java代碼調用本地代碼。JNI提供了基礎數據類型的對應,如八種基礎類型和字元串類型。
第二步:開始學習JNI。首先使用C編寫簡單的示例,關鍵在於調用動態鏈接庫(如.dll在Windows或.so在Unix系統)的代碼(System.loadLibrary("hello");)。編譯Java代碼並生成頭文件。頭文件定義了函數,函數命名規則遵循Java包名和類名加上函數名,同時使用extern "C"來告知編譯器遵循C的函數命名規則。C文件中定義函數實現。
第三步:將C文件替換為C++文件,繼續編譯和運行。
第四步:學習JNI基礎類型和Java類型之間的轉換。JNI提供了多種轉換介面,以適應不同類型的數據交換。注意,jni本質上是一個C介面,它不傳遞對象。
第五步:傳遞基礎類型、String類型和基礎類型數組。基礎類型不需要轉換,而String類型需要在jni和c之間進行復雜的轉換,通常使用jstring和char*之間進行轉換。數組傳遞涉及內存分配、內容復制和介面調用。
第六步:獲取Java類的成員變數、靜態變數、成員方法和類靜態方法。通過JNI獲取類的引用,然後調用相應的方法。調用實例方法和靜態方法遵循類似的步驟。
第七步:在native代碼中調用Java的構造方法創建對象。使用NewObject()創建對象,然後返回到Java環境。
第八步:了解局部引用和全局引用。在JNI中管理引用非常重要,局部引用在方法結束時失效,而全局引用需要創建以保持引用的有效性。
第九步:了解JNI的常見錯誤,如找不到本地庫的錯誤(SEVERE: java.lang.UnsatisfiedLinkError)。解決方案是添加本地庫的路徑到"java.library.path"。
總體而言,JNI提供了一種方法來集成本地代碼到Java應用中,以提升性能或訪問特定功能,但其使用需遵循特定的規則和最佳實踐。
2. 什麼叫介面文件
介面就是你要提供給用戶的功能。用戶需要什麼就提供什麼介面。比如用戶需要發送文件,你就要提供發送文件的方法(介面)。