对指定目录下的jar进行DexClassLoader方法动态加载,加载结束后,将临时的jar和dex文件删除。
在SO中通过反射对指定目录下的xxx.jar进行动态加载,会出现函数阻塞的情况,如果此前没有dex文件,那么调用DexClassLoader后,会生成dex文件,但是DexClassLoader函数出不来。关闭应用,再次打开,因为jar和dex都存在,就可以成功,并且加载后会删除dex文件,再次打开也是正常的。
在java中执行时,无论此前是否有xxx.dex都会成功。
JNI:
不管在so还是在java层,都是通过反射,参数和流程都是一样,怎么会出现这种问题?
下面是执行的代码:
jobject JarLoad( JNIEnv* env,jobject clazz,jobject thiz )
{
jstring dexpath = env->NewStringUTF("data/data/com.example.test/.cache/classdex.jar");
jstring dex_odex_path = env->NewStringUTF("data/data/com.example.test/.cache");
const char* dexStr = (char*)env->GetStringUTFChars(dexpath, 0);
const char* odexStr = (char*)env->GetStringUTFChars(dex_odex_path, 0);
jclass classloaderClass = env->FindClass("java/lang/ClassLoader");
jmethodID getsysloaderMethod = env->GetStaticMethodID(classloaderClass, "getSystemClassLoader","()Ljava/lang/ClassLoader;");
jobject loader = env->CallStaticObjectMethod(classloaderClass,getsysloaderMethod);
jclass dexLoaderClass = env->FindClass("dalvik/system/DexClassLoader");
jmethodID initDexLoaderMethod =env->GetMethodID(dexLoaderClass, "<init>","(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)V");
jobject dexLoader =env->NewObject(dexLoaderClass,initDexLoaderMethod, dexpath, dex_odex_path, dex_odex_path, loader);
ALOGE("JarLoad dexload %s",dexLoader?"success":"fail");
env->ReleaseStringUTFChars(dexpath, dexStr);
env->ReleaseStringUTFChars(dex_odex_path, odexStr);
env->DeleteLocalRef(dexpath);
env->DeleteLocalRef(dex_odex_path);
env->DeleteLocalRef(classloaderClass);
env->DeleteLocalRef(loader);
env->DeleteLocalRef(dexLoaderClass);
env->DeleteLocalRef(dexLoader);
}
Jvav:
DexClassLoader dLoader;
dLoader = new DexClassLoader("/data/data/"
+ base.getPackageName() + "/.cache/classdex.jar", "/data/data/"
+ base.getPackageName() + "/.cache", "/data/data/"
+ base.getPackageName() + "/.cache/", base.getClassLoader());
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课