夢迴程式設計-由LD_LIBRARY_PATH引發JNI的理解

餘二五發表於2017-11-16
前些天在配置通過OCI的方式連線Oracle中曾進碰到一個關於“java.lang.UnsatisfiedLinkError: no XXX in java.library.path”這麼一個問題,這個問題糾結了許久才解決,解決方式參考前面的文章。
趁雙休日好好的理解一下產生這個問題的來龍去脈。
先看一段話先:

PATH is the environment variable.

java.library.path is the system properties.

When the java application started, JVM will set java.library.path’s value using PATH’s value.

In java program, it’s very difficult to get the value of environment variables, but it’s very easy to get/set system properties. Use
System.getProperty(”project_root”, “..”);

System.setProperty(”project_root”, “..”);
java.libaray.path 是system properties,在windows系統通常是使用PATH的值,而在Linux上是用LD_LIBRARY_PATH的值。 隨便也說一下java.class.path,他是對應於CLASSPATH中的值。

那LD_LIBRARY_PATH的值主要是幹什麼呢?他是來處理非標準路徑下的”共享庫“的,可以理解成windows 的dll,但在linux下是*.so的檔案。
說完了基本的概念,再來看看OCI是怎麼連線Oracle的,其實OCI是通過JNI(java native interface)的方式來訪問Oracle的,請看下圖

1)我們知道Oracle的驅動是classes12.jar(ojdbc14.jar),這裡應該對應著java-class;

2)同樣我們在JBOSS啟動指令碼中設定  JBOSS_NATIVE_DIR=”/opt/instantclient_10_2″,其實就是將LD_LIBRARY_PATH=”/opt /instantclient_10_2″,而在這個目錄下有大量的*.so檔案,這些應該對應native;

3)至於jni-stub是一些存根檔案,可以參考一下JNI相關的說明,這裡就暫不描述了(有時間可以再深入學習)。
本文轉自 神相 51CTO部落格,原文連結:http://blog.51cto.com/shenxiang/269201,如需轉載請自行聯絡原作者


相關文章