我需要在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()错误,但初始文件加载正常。它可能是原生代码中的东西吗?谢谢你的帮助。
答案 0 :(得分:2)
我在this post中偶然找到了答案。 ApplicationInfo.dataDir保存数据目录的位置,并且可以从那里轻松导航“lib”:
superCollider = new SCAudio(container.$context().getApplicationInfo().dataDir + "/lib");
或者,nativeLibraryDir将您直接带到lib目录,但需要API级别9。
感谢您的帮助!
答案 1 :(得分:1)
getDir
将始终将app_添加到目录名称,因此第一次使用它是非常奇怪的。我或者只是期望app_在那里或尝试使用getFilesDir
,至少你总是知道它会返回什么。 SuperCollider是否对目录名称有限制?
我发现另一个SuperCollider Project似乎与您最初使用评论“ // TODO:不是非常可扩展,”做同样的事情。我发现这很有趣:)