【问题标题】:Get Android application lib directory获取Android应用lib目录
【发布时间】:2012-09-28 18:58:54
【问题描述】:

我需要在我的 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() 错误,但初始文件加载正常。它可能是本机代码中的东西吗?感谢您的帮助。

【问题讨论】:

  • 您可能使用 System.loadLibrary() - 此方法知道应用程序库的安装位置。相反,getDir() 努力 为您的应用程序提供一个可以安全地用于文件操作的目录,使其不会与特殊目录冲突,其中 lib 就是一个例子。

标签: java android android-ndk native supercollider


【解决方案1】:

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

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

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

感谢您的帮助!

【讨论】:

  • 在 Gingerbread 中引入 nativeLibraryDir 并非巧合。以前,lib 目录可以在 dataDir/../lib 中可靠地找到,但从那时起,应用程序可以安装在外部存储上。因此,建议的做法是检查 API 版本并在可用时使用 nativeLibraryDir
【解决方案2】:

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

我发现另一个 SuperCollider Project 似乎在做与您最初在评论“// TODO:不太可扩展,”中所做的相同的事情.. 我觉得这很有趣 :)

【讨论】:

  • 谢谢,我想知道是不是 getDir()。 “/lib”是本地库的常规位置;我认为可以改变它;幸运的是,有一个很好的方法可以找到“lib”。
猜你喜欢
  • 2014-06-12
  • 1970-01-01
  • 1970-01-01
  • 2011-06-11
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
  • 2014-05-27
相关资源
最近更新 更多