2014-12-30 54 views
0

我遇到本機函數使用的相對文件路徑問題。當我從Java代碼調用本地C函數時,由於空文件指針,我得到了段錯誤。唯一可行的是將這些路徑更改爲絕對文件路徑,這對我來說不是解決方案。有沒有辦法設置本地函數的根目錄,或者使用Java項目根文件夾來瀏覽目錄,或者絕對路徑是唯一的方法?Java JNI接口:本地函數相對文件路徑

回答

-1

你在Linux中在Linux下工作嗎? ,您可以在路徑 $LD_LIBRARY_PATH=.so file path 添加到~/.bashrc文件,然後重新啓動..

如果您的工作與Windows,你可以把.dll文件中作爲.class文件路徑的路徑。

+0

是的,我在Ubuntu 14.04目前工作,我使用System.load()函數加載.so文件,所以我可以指定絕對庫路徑。我不確定我是否理解你說的。這是否意味着我可以爲主目錄設置包含.so文件的目錄,並相對於該目錄進行導航? –

+0

哦,我很抱歉。我不認爲你懂中文... – luckyqiao

+0

我不:D我已經解決了我的問題,不過謝謝你! :) –

1

Java does not have a way to change the working directory

這是因爲the Java developers consider changing the working directory to create more problems than it solves。具體如下:

  • 這將是全局可變狀態。全局可變狀態使得難以將應用程序的各個部分彼此隔離。
  • 它很容易出現競態條件(全局可變狀態的另一個副作用)。
  • 它不會有很大的好處。您可以通過更改當前目錄來完成所有可以通過絕對路徑完成的操作。

您的C代碼將需要使用絕對路徑。另外,如果您願意編寫額外的C代碼,您的C代碼可以直接調用操作系統的chdir函數。這可能是危險的,因爲JVM不是爲這種可能性而設計的。

+0

我不是懶得在C代碼中指定絕對路徑,但問題是將應用程序移動到另一臺PC。在Linux中,絕對路徑是「/ home/user_name/...」。如果我在另一個帳戶上運行應用程序會怎樣 –

+0

@VladimirDjurdjevic爲什麼使用絕對路徑意味着對它們進行硬編碼? – immibis

+0

那就是我之前所教的知道我可以使原生函數和Java代碼進行通信。我教過,唯一的方法就是用C代碼做一些事情。我從來沒有使用過JNI,或者之前的任何其他類似的東西,我只是學生從事獨奏項目的工作,而且我需要學習的遠遠超過他們在學校教給我的東西:D無論如何謝謝! –

0

我解決了這個問題!解決方案使用File.getAbsoluteFilePath()函數,並將其傳遞給本機C函數。它也可以用於查找共享庫的絕對路徑,從而使應用程序平臺無關。 C代碼可以在與Java代碼綁定之前瀏覽它的目錄。