2012-09-28 108 views
0

我需要在我的Android應用程序中指定一些本地庫的位置。我用硬編碼的字符串來完成這個工作:獲取Android應用程序庫目錄

public static final String DLL_DIR_STR = "/data/data/my.application.package/lib"; 

但是想要從Android獲取路徑。下面的帖子像this,我使用GETDIR()來查找lib目錄,改變

superCollider = new SCAudio(DLL_DIR_STR); 

superCollider = new SCAudio(container.$context().getDir("lib", 0).getAbsolutePath()); 

奇怪的是,初始庫似乎加載正確

Trying to load lib /data/data/my.application.package/lib/libsndfile.so 0x42718d80 
Added shared lib /data/data/my.application.package/lib/libsndfile.so 0x42718d80 
No JNI_OnLoad found in /data/data/my.application.package/lib/libsndfile.so 0x42718d80, skipping init 
Trying to load lib /data/data/my.application.package/lib/libscsynth.so 0x42718d80 
Added shared lib /data/data/my.application.package/lib/libscsynth.so 0x42718d80 

但是,當libscsynth試圖加載一些額外的代碼,它使用了錯誤的路徑:

OK, listing opendir(/data/data/my.application.package/app_lib) 

「app_」來自哪裏?我以爲我必須使用getDir()錯誤,但初始文件加載正常。它可以是本地代碼中的東西嗎?謝謝你的幫助。

+1

您可能使用** System.loadLibrary()** - 此方法知道應用程序庫的安裝位置。相反,** getDir()** _works hard_提供一個目錄,您的應用程序可以安全地用於文件操作,以便它不會與特殊目錄衝突,其中** lib **就是一個例子。 –

回答

2

我找到了答案,相當偶然,在this postApplicationInfo.dataDir保存數據目錄的位置,而「LIB」是很容易從那裏導航到:

superCollider = new SCAudio(container.$context().getApplicationInfo().dataDir + "/lib"); 

另外,nativeLibraryDir帶您直接到lib目錄,但需要API級別9

感謝你的幫助!

+1

** nativeLibraryDir **在薑餅中引入並非巧合。之前,** lib **目錄可以在** dataDir /../ lib **中可靠地找到,但是之後可以將應用程序安裝在外部存儲上。因此,推薦的做法是檢查API版本並使用** nativeLibraryDir **(如果可用)。 –

1

getDir將始終將app_添加到目錄名稱中,所以它在第一次運行時非常奇怪。我要麼只是期望app_在那裏或嘗試使用getFilesDir,至少你總是知道它會返回什麼。 SuperCollider對目錄名稱有限制嗎?

我發現了另一個SuperCollider Project,這似乎是在做你的評論「// TODO:不是很可擴展的,」最初做同樣的事情。我發現,有趣的:)

+0

謝謝,我想知道它是否是getDir()。 「/ lib」是本地圖書館的常規位置;我認爲有可能改變它;幸運的是,有一個很好的方法來找到「自由」。 – Tbadams

相關問題