Mac OS X中的JNI調用和實現

網上給出的在Windows和Linux操做系統下的JNI編程教程不少,其實不管在哪一個系統中都是類似的步驟。總結以下: java

  1. 編寫Java程序文件,要使用調用本地庫的類需在static初始化塊內使用System.loadLibrary("庫名")方法加載。
  2. 編譯該Java類得到.class文件,而且使用javah -jni 類名獲取「類名.h」頭文件。
  3. 包含該頭文件並實現頭文件中聲明的方法。
  4. 編譯並生成本地庫文件。
  5. 將該庫文件放置於java.library.path路徑(能夠經過System.getProperties().get("java.library.path")查看該路徑)下,便可正常使用該Java類。

惟一不一樣的處在於本地庫文件的編譯方式不一樣。 linux

Windows中,通常使用VisualStudio IDE生成"庫名.dll"動態連接庫文件。(注意:庫文件的命名方式及其重要!) 編程

Linux中使用gcc進行編譯。通常要使用-I選項包含$JAVA_HOME/include和$JAVA_HOME/include/linux,並使用-fPIC -shared -o lib庫名.so生成動態連接庫文件。 測試

而在Mac OS X中,採用和Linux和有類似的作法。可是我嘗試後發現,不管我將該庫文件放置於何處,而且如何設置java.library.path都會產生java.lang.UnsatisfiedLinkError異常,說沒法找到該庫文件。網上也未找到答案。後來偶然在java.library.path路徑之一的/usr/lib/java中發現裏面有個libjdns_sd.jnilib文件。莫非這個動態庫文件必須以jnilib做爲後綴名?當即更改文件名,果真能正常運行!
spa

結論:Mac OS X中,欲使用JNI調用本地庫,該庫文件名稱必須是 lib庫名.jnilib,而不是以.so爲後綴名。 操作系統

至於Windows和Linux中動態庫文件名到底爲什麼,本人未作測試。通常而言,應該能夠在java.library.path中找到例證。 教程


補充: dns

在用Eclipse開發時,若是java.library.path包含.(當前文件夾),則將對應本地庫文件置於項目文件夾下(src和bin的父文件夾)。 ip

相關文章
相關標籤/搜索