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 には、ディレクトリ名に制限がありますか?

「 // TODO: not very extensible, 」というコメントで最初に行ったのと同じことを行っているように見える別のSuperCollider プロジェクトを見つけました。面白いことがわかりました :)

于 2012-09-28T20:33:54.110 に答える