2

複数の Android アプリケーション プロジェクトで使用される Android ライブラリ プロジェクト (A) があります。libsライブラリ プロジェクトのフォルダー内に配置されたライブラリ jarは、com.lib.Rこのプロジェクト内のリソース ファイル (画像など) を参照します。

アプリケーション プロジェクト (B) がこのライブラリを使用すると、libs フォルダー内の jar ファイルをトリガーして、 によって参照されるリソースを参照するコードが呼び出される場合がありますcom.lib.R。残念ながら、これらのリソースにアクセスしようとすると、次のエラーが発生します。

java.lang.NoClassDefFoundError: com.lib.R$layout

これらのリソースが のsrc/フォルダーLib Aまたは のsrc/フォルダーからアクセスされる場合Project B、それらは値に正しく解決intされて使用できますが、それを行わずにコードをlibsフォルダー内に保持することをお勧めします。

私の質問- なぜこれが起こるのか、どうすれば解決できますか? 回避策の 1 つは、 を使用してプログラムでリソース ID を取得することですresource.getIdentifier()が、これは非常に手間がかかります。ヘルパー メソッドを使用して手動で解決しなくてもcom.lib.R、ライブラリ jar から引き続き使用できる方法はありますか?libs

これがあなたを助けるためのイラストです。

ライブラリからのリソース アクセス

ライブラリからのリソース アクセス

4

1 に答える 1

2

どうすればそれを改善できるか

あなたの目的はAとBをソース形式で配布できるようにすることであると仮定しますが、コンテンツは配布できませんsome_lib.jar(「これが行われた理由は、Javaファイルをエンドユーザーに公開することを避けるためでした」)。その場合:

ステップ #1: ソース コードsome_lib.jarとそれが参照するすべてのリソースを含む別のライブラリ プロジェクト (L) を作成します (これらのリソースを A から L に移動します)。

ステップ #2:先ほど書いたレシピに従って配布ライブラリ プロジェクト (LD) を作成する

ステップ #3: A を LD に依存させ、L のコードのコンパイル済み JAR と共にリソースを取得します。

ステップ #4: ソースを配布するときは、LD も配布します

のコード用の正式なライブラリ プロジェクトを作成し、some_lib必要なリソースをそのライブラリ プロジェクトで宣言することによって、B で動作する JAR をコンパイルできるようになることを願っています。

さて、これは私が試したよりも複雑なので、あなたが経験しているのと同じ結果になる可能性は十分にあります. その場合、少なくとも Gradle ベースのビルド システムに切り替えるまでは運が悪く、L/LD は AAR ファイルになり、うまくいけば動作します。

于 2013-07-10T21:14:31.990 に答える