簡體   English   中英

JNI DLL如何搜索其依賴的本機DLL?

[英]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的搜索嗎?

添加1

似乎我從這里確認了2個級別的猜測: 如何在Eclipse啟動時將本機庫添加到“java.library.path”(而不是覆蓋它)

請參閱kevin cline的評論。 但是,提到的LD_LIBRARY_PATH環境變量解決方案僅適用於Linux。

添加2

我想我沒有說清楚我的問題。 讓我這樣說吧。

我的困惑是: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM