1. 程式人生 > >Android動態載入Jar

Android動態載入Jar

定義介面, 把實現介面的部分打包成jar 在

將打包好的jar拷貝到SDK安裝目錄android-sdk-windows\platform-tools下,DOS進入這個目錄,執行命名:

dx --dex --output=test.jar update.jar

核心載入程式碼

@SuppressLint("NewApi")

private void executeLoadDex() {
// sd中建立的動態載入新資料夾
//public static final String DYNAMIC_FOLDER_PATH = new StringBuilder(
//Environment.getExternalStorageDirectory().getAbsolutePath()).append(File.separator).append("MCC_DYNAMIC")
//.toString();
//// 動態載入jar名稱
//public static final String DYNAMICLOAD_JAR_NAME = "update.jar";

File optimizedDexOutputPath = new File(
Constant.DYNAMIC_FOLDER_PATH + File.separator + Constant.DYNAMICLOAD_JAR_NAME);


if (optimizedDexOutputPath.exists()) {
WLog.i("optimizedDexOutputPath.exists()");
/**
* 定義DexClassLoader //第一個引數:是dex壓縮檔案的路徑 //第二個引數:是dex解壓縮後存放的目錄
* //第三個引數:是C/C++依賴的本地庫檔案目錄,可以為null //第四個引數:是上一級的類載入器
*/
File dexOutputDir = Utils.getContext().getDir("dex", 0);
DexClassLoader cl = new DexClassLoader(optimizedDexOutputPath.getAbsolutePath(),
dexOutputDir.getAbsolutePath(), null, getClassLoader());


try {
Class<?> libClass = cl.loadClass("com.example.javasdk.dynamic.JarILoaderimpl");
WLog.i("optimizedDexOutputPath.exists()" + libClass);
ILoader lib = (ILoader) libClass.newInstance();
Toast.makeText(Utils.getContext(), "CoreService" + lib.sayHi(), Toast.LENGTH_SHORT).show();
WLog.i("CoreService  executeLoadDex lib.startAllTask()");
// lib.startAllTask();
} catch (Exception e) {
WLog.e("CoreServiceException" + e.toString());
e.printStackTrace();
}
}
}