1

そのため、現在 Android では方法がありませんが、依存する共有ライブラリを手動でプリロードする必要があります。それは私にとっては問題ありません。大したことではありません。Android ビルドシステム (ビルド前のライブラリ機能) にもいくつかの問題があります。そのため、依存する共有ライブラリの異なるビルドに別の名前を付ける必要がありました: libsal.solibsal-slim.so。ビルド設定に応じて、これら 2 つのいずれかが最終的な apk になります。次に、Java 側で libsal.so のロードを試み、失敗した場合は libsal-slim.so のロードを試みます。

/system/libにインストールされたデフォルトのファームウェアでそのlibsal.soを出荷する電話に出くわすまで、それはすべてうまくいきました。そのため、libsal-slim.so でビルドされている場合、私のアプリはその電話での動作を停止しました。これは、最初に libsal.so をロードしようとし、/system/lib から間違ったライブラリをロードするためです。

質問: インストール フォルダのライブラリのみがロードされるようにするにはどうすればよいですか? アプリのインストール フォルダを何らかの方法で取得し、共有ライブラリのフル パスを「計算」することはできますか? Java ブードゥー教の魔法はどうすればできますか? 私は一般的にJavaとAndroidの初心者です。この質問があまりにも素朴に見える場合:)そして、はい、私は英語を話せません(または彼らの言い方)、c ++に頼ってください[冗談の終わり]

libsal.so は実際の名前ではなく、例としてのみ使用しました。

4

1 に答える 1

0

を使用System.load(fullpath_of_the_lib)すると、おそらく問題を解決できます。

しかし、問題は fullpath_of_the_lib を取得することです。実際、Android API では、リソースのパスを取得できません。ストリームを取得して読み取ることしかできません。

この制限を回避するには、次のことを実行できます。

  • ライブラリをアプリのアセットフォルダーに入れます。
  • lib で InputStream を開きます。getAssets().open("libsal.so")
  • SDカードに「libsal.so」(または何でも)という名前のファイルを作成します
  • 入力ストリームから作成したばかりのファイルにバイトをコピーします
  • SDカード上の「libsal.so」の絶対ファイルパスを取得します
  • 電話System.load(fullpath_of_the_lib_on_the_sd_card)

もちろん、lib の最後のステップだけが必要です。SD カードには既にあります。

より簡単な代替手段は、別のライブラリ名と競合しないように、lib の名前を libMyVeryUncommonLibraryName.so のような名前に変更することです。

于 2013-01-30T21:27:09.967 に答える