0

以下の投稿に記載されている正確な手順に従いました。

Android アプリケーションから実行時にライブラリを動的にロードすることは可能ですか?

私はAndroid 2.2電話をテストに使用しており、エラーが発生して私を夢中にさせています:(

07-27 01:24:55.692: W/System.err(14319): java.lang.ClassNotFoundException: ローダー dalvik.system.DexClassLoader@43abbc20 の com.shoaib.A​​ndroidCCL.MyClass

誰かが今何をすべきか助けてくれますか..さまざまな投稿でさまざまな提案された解決策を試しました

これが実現可能かどうか疑問に思っていたので、次のクラスを作成しました。

package org.shoaib.androidccl;

import android.util.Log;

public class MyClass {
    public MyClass() {
        Log.d(MyClass.class.getName(), "MyClass: constructor called.");
    }

    public void doSomething() {
        Log.d(MyClass.class.getName(), "MyClass: doSomething() called.");
    }
}

そして、デバイスの SD カードに として保存した DEX ファイルにパッケージ化しました/sdcard/testdex.jar

次にMyClass、Eclipse プロジェクトから削除してクリーンアップした後、以下のプログラムを作成しました。

public class Main extends Activity {

    @SuppressWarnings("unchecked")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        try {
            final String libPath = Environment.getExternalStorageDirectory() + "/testdex.jar";
            final File tmpDir = getDir("dex", 0);

            final DexClassLoader classloader = new DexClassLoader(libPath, tmpDir.getAbsolutePath(), null, this.getClass().getClassLoader());
            final Class<Object> classToLoad = (Class<Object>) classloader.loadClass("org.shoaib.androidccl.MyClass");

            final Object myInstance  = classToLoad.newInstance();
            final Method doSomething = classToLoad.getMethod("doSomething");

            doSomething.invoke(myInstance);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
4

1 に答える 1

0

問題は MyClass を DEX にパッケージ化する方法にあると思います。どうやってそれをしますか?

Shlublu のスレッドをたどり、自分で試してみて成功しました。 「MyClass を DEX にパッケージ化する」方法がわからないので、単純に android apk をビルドして sdcard に入れます。そして、コードは機能しました。

MyClass を classes.dex でラップしていますか? DexClassLoader は、jar/dex 内の classes.dex のみを検索します。 おそらく、最初に私が行ったことを試して (jar の代わりに署名付き apk をビルドしますが、apk をインストールする必要はありません)、それが機能するかどうかを確認できます。お役に立てれば!

于 2014-02-20T01:00:27.533 に答える