[英]How does a JNI DLL search for its dependent native DLL?
說我有JNI.dll
。 這取決於native.dll
。 現在我的Java應用程序調用System.loadLibrary("JNI")
。
以下文件夾布局是否有效?
MainFolder
|--main.exe
|--SubFolder
|--JNI.dll
|--native.dll
我的猜測是,有兩個級別的依賴解析。
[1級]:
System.loadLibrary("JNI")
使用JVM屬性java.library.path
來定位JNI.dll
。
[等級2]:
JNI.dll
依賴Windows系統機制來定位native.dll
。
這個對嗎?
如果我將%_JAVA_OPTIONS%
設置為-Djava.library.path=MainFolder\\SubFolder
,我認為它可以涵蓋搜索JNI.dll
。 但它也會覆蓋對native.dll
的搜索嗎?
似乎我從這里確認了2個級別的猜測: 如何在Eclipse啟動時將本機庫添加到“java.library.path”(而不是覆蓋它)
請參閱kevin cline的評論。 但是,提到的LD_LIBRARY_PATH
環境變量解決方案僅適用於Linux。
我想我沒有說清楚我的問題。 讓我這樣說吧。
我的困惑是: JNI.dll
依賴於native.dll
。 他們兩人是不是在main.exe
的當前工作目錄。 實際上它們位於CWD的子文件夾中。
如果我直接運行main.exe
,我只需要設置java.library.path = <other path>\\MainFolder\\SubFolder
。 兩個DLL都可以正確找到。
但是如果我從Eclipse運行我的項目, 除了設置java.library.path
之外 ,我還必須將“\\ MainFolder \\ SubFolder”放在%PATH%環境變量中。
我只是不知道為什么Eclipse如此不同。
1)它在當前目錄中搜索。
2)系統文件夾通常為C:\\ Windows \\ System32(使用帶有shgetspecialfolderpath()
來獲取給定系統上的rigth文件夾)
3)Windows文件夾(C:\\ Windows)(帶有shgetspecialfolderpath()
以獲取給定系統上的正確文件夾)
4)PAth environmnet變量下列出的所有文件夾
類似的鏈接: 我必須將所有相關的DLL放入JDK的bin文件夾中嗎?
靈感來自這個線程: 系統與用戶PATH環境變量... winmerge只有在我添加路徑到用戶PATH時才有效
我開始懷疑我的用戶%Path%可能太長了 。 所以我將包含我的依賴DLL的文件夾路徑從User%PATH%的末尾移動到開頭 。 它現在有效!
首先,我得出結論,實現Windows的DLL查找算法的人有一些截斷問題。 我幾乎認為這是另一個惱人的Windows Bug。
但我寫了另一個Windows應用程序,它具有類似的DLL依賴關系來確認我的猜測。 該應用程序工作正常! 所以我必須回顧一下我的結論。
我逐個檢查了我的用戶%PATH%條目,並將文件夾放在每個可能的位置。 最后,我找到了根本原因 。
我在User%PATH%中有一個
C:\\MinGW\\bin
條目,它碰巧包含一個libstdc++-6.dll (977KB)
但不幸的是,它與我需要的(825KB)
不兼容(825KB)
。 它只適用於我在MinGW之前放置我的文件夾。
現在這個問題似乎得到解決 但另一個出現了,如果我想同時使用我的DLL和MinGW,我是否需要來回切換?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.