Android動態載入Jar
阿新 • • 發佈:2019-01-01
定義介面, 把實現介面的部分打包成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();
}
}
}