1

我需要在我的 Android 应用程序中指定一些本机库的位置。我用一个硬编码的字符串来完成这个:

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

但想从 Android 获取路径。在这样的帖子之后,我使用 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() 错误,但初始文件加载正常。它可能是本机代码中的东西吗?谢谢你的帮助。

4

2 回答 2

2

我很偶然地在这篇文章中找到了答案。 ApplicationInfo.dataDir保存数据目录的位置,“lib”很容易从那里导航到:

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

或者,nativeLibraryDir将您直接带到 lib 目录,但需要 API 级别 9。

谢谢你的帮助!

于 2012-09-29T00:37:44.673 回答
1

getDir将始终将 app_ 添加到目录名称之前,因此它第一次工作很奇怪。我要么只是期望 app_ 在那里,要么尝试使用getFilesDir,至少你总是知道它会返回什么。SuperCollider 对目录名称有限制吗?

我发现了另一个SuperCollider 项目,它似乎在做与你最初所做的相同的事情,评论“ // TODO: not very extensible, ”.. 我觉得这很有趣:)

于 2012-09-28T20:33:54.110 回答