1. 程式人生 > >Android動態載入Jar包並實現Native方法

Android動態載入Jar包並實現Native方法

一直以來,在Android專案中引用第三方SDK都是將其複製到lib目錄下,根據開發環境的不同進行配置(在Android studio中需要使用工具進行新增File dependency到gradle中),便可直接呼叫內部方法進行實現。 現因公司的需求所以更改了引用Jar包的方式,對,那就是動態載入Jar包 前提:Jar包為公司內部SDK 公司需求:為實現在提供給使用者後,防止SDK被篡改,需使用SM3演算法對其加密,並在非首次呼叫的時候進行驗證,如果與首次生成的SM3值不同則為SDK已被篡改(首次生成的SM3值會儲存,以供對比) 實現方式: 1:將Jar包放入sdk-build-tools目錄下的某版本中,執行dx --dex --output=xxx_dex.jar xxx.jar 命令,將此jar包轉換為dex包並放到工程目錄的assets中 2:將工程目錄中的dex包複製到真機私有目錄下,使用DexClassLoader類載入器載入dex包(jar包)中的類名並得到類物件,相關程式碼:
  DexClassLoader dcl = new DexClassLoader(dex.jar包的路徑,載入後dex檔案存放位置 , null, context.getClassLoader());  類載入器
  Class sotp = dcl.loadClass("com.zryf.sotp.SotpClient");  載入類
  Log.i("sotpClient --> ", "=" + sotp.getName());Method method = sotp.getMethod("getInstance", Context.class);  參1:查詢SDK中初始化方法 參2:引數型別Object sotpClient = method.invoke(null
, context); 反射得到類物件
  Method sotpAppInfoMethod = sotp.getMethod("downLoadInit", String.class);
  String val = (String) sotpAppInfoMethod.invoke(sotpClient, "333");  反射類物件中的方法並得到返回值 
通過以上方法即實現了動態載入jar包