2012-03-23 9 views
3

次のような状況を考えてみましょう:P1とP2という2つのアンドロイドプロジェクトがあり、どちらも同じprocess-idを使用するapkを生成し、アンドロイドで P1とP2はどちらもJavaライブラリJL1を使用します。 JL1は実行時に共有ライブラリ1 SL1をロードします。アンドロイドビルドシステムでネイティブ共有ライブラリをロードするJavaライブラリを処理する方法

実行時に表示されるのは、このSL1をロードしているときに、ある時点でjava/lang/UnsatisfiedLinkErrorが発生することです。 これも出力されます:すでに開いている共有ライブラリ。

この問題の原因は何ですか?私は、javaのライブラリコードは、すべてのプロジェクト/ apkにコピーされていると想定しています。また、実行時には、apksが1つのプロセスでマージされてコピーについて忘れてしまいます。したがって、すべてのコピーはその共有ライブラリ自体をロードし、既にロードされたエラーを引き起こします。

もしそうなら、この望ましくない動作ではありません。なぜなら、同じプロセス内に複数回使用される共有ライブラリを持つJavaライブラリを持つことはできないからです。

[編集]私は、すべてのapkが(同じプロセスでも)独自のクラスローダーを使用することを知りました。つまり、すべてのJLはapkごとにクラスがロードされるため、すべての共有オブジェクトが複数回ロードされ、エラーが発生します。誰かの考えをどのようにこれを回避するには? apksにクラスローダーを共有させることは可能ですか?

+0

P1とP2が別のクラスローダーによって読み込まれるように見えます。それを確認できますか?これが本当に当てはまる場合、AFAIKこれは期待される動作です。つまり、「同じJNIネイティブライブラリを複数のクラスローダーにロードすることはできません」 http://docs.oracle.com/javase/1.4.2/docs/guide/jni/jni-12.html回避策の1つは、ネイティブ・メソッドにアクセスする必要があるクラスが1つだけであるようにクラスを設計することです。 –

+0

私は見つけなければならないと思う。私はアンドロイドがこれをどのように処理するのか分かりません。私はあなたがリジッドだと思う。質問で説明したように。私は、同じプロセスで読み込まれる2つの異なるapkを使用します。私はアンドロイドがすべてのapkのために1つのクラスローダーをインスタンス化すると想像することができます。すべてのプロセスにクラスローダを作成する方が良いでしょう。アンドロイドがこれをどのように処理するかを調べなければならない。 – Bjorn

+0

私はそれを探しました。すべてのapkには独自のクラスローダーがあります。つまり、共有オブジェクトは2回ロードされます。これを修正するためのアイデアですか? – Bjorn

答えて

1

すべてのapkには独自のクラスローダーがあります。つまり、2つのプロジェクト/ apkにはライブラリのクラスのコピーがあります。実行時にロードされます。したがって、同じクラスのように見えるのは実際にはコピーです。したがって、そのようなクラスにネイティブライブラリをロードすると、ロードされたすべてのクラスに対してロードされます(これは静的フィールドで行われています)。 2つのapkが同じプロセスを共有する場合、ネイティブ共有オブジェクトを複数回ロードすると実行時エラーが発生します。

関連する問題