以下の投稿に記載されている正確な手順に従いました。
Android アプリケーションから実行時にライブラリを動的にロードすることは可能ですか?
私はAndroid 2.2電話をテストに使用しており、エラーが発生して私を夢中にさせています:(
07-27 01:24:55.692: W/System.err(14319): java.lang.ClassNotFoundException: ローダー dalvik.system.DexClassLoader@43abbc20 の com.shoaib.AndroidCCL.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();
}
}
}