首页
社区
课程
招聘
[求助]DEX动态加载出现失败
发表于: 2014-6-9 10:58 13044

[求助]DEX动态加载出现失败

2014-6-9 10:58
13044
对指定目录下的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直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 93
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
已经解决,是因为在验证时,采用二选一,要么java加载,要么so加载,so在onload中进行了ptrace自己,导致dexload出现问题所致。
2014-6-9 12:53
0
雪    币: 228
活跃值: (95)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
LZ你好!我也遇到了这个问题,为什么so在onload中进行了ptrace自己,就会导致dexload失败呢?难道ptrace和dexload会有冲突?
2015-2-26 20:45
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我也遇到了,ptrace好像很会和classloader冲突,但怎么解决呢,我必须在c层classloader
2015-7-28 10:58
0
游客
登录 | 注册 方可回帖
返回