首页
社区
课程
招聘
[求助]关于使用DexClassLoader加载的一些问题...
发表于: 2014-11-24 18:31 9917

[求助]关于使用DexClassLoader加载的一些问题...

2014-11-24 18:31
9917
尝试使用DexClassLoader能够正常加载外部dex文件了,也能正常运行,但还有问题,
就是我这样加载的类  在Jni函数中使用env->FindClass("类名") 获取不到... 求各位大神指教...

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
2
实际上Android(4.4.4,别的版本源码没看过)系统维护了两份dex cookie,一份在Java层的BaseDexClassLoader类里面(笑而不语。。。),另一份在Native层gDvm.userDexFiles里面。
目前两份没有同步,所以在Java层加载dex之后,Native层获取不到。

解决办法,要么在Native层调Java的方法(BaseDexClassLoader.findClass),要么在Native加载dex。
2014-11-24 19:00
0
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
3
补充以下,libdvm.so里面有个jni函数叫Dalvik_dalvik_system_DexFile_openDexFile,用这个函数加载,可以直接用env->FindClass找到,至于Java层怎么用,自己查查吧,我不知道
2014-11-24 21:37
0
雪    币: 155
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
感谢提醒,之前就发现了BaseDexClassLoader,但是没有注意这个类的区别。
一语点醒。
2014-11-25 09:25
0
雪    币: 59
活跃值: (45)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
是不是Dalvik_dalvik_system_DexFile_openDexFile只能用于4.0以上的系统?
2014-11-25 14:15
0
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
6
2.3也有这个函数。有一个Dalvik_dalvik_system_DexFile_openDexFile_bytearray是4.0之后才添加的。
2014-11-25 14:25
0
雪    币: 59
活跃值: (45)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
按照你说的我在java层获取到了动态加载的类传递到Jni函数
然后使用env->RegisterNatives 注册函数 还是会提示
ERROR: Unable to find decl for native xxx
估计还是没同步的原因,不知道还有没有其他方法...
我没有在Jni层加载dex 是怕兼容性不好 所以在java层加载...
2014-11-26 14:38
0
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
8
env->FindClass返回的实际上是一个LocalReference,RegisterNatives的参数也是。
目测你是结构没搞对。
2014-11-26 16:16
0
雪    币: 191
活跃值: (195)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
9
大神谢谢分享
2016-5-10 11:42
0
雪    币: 547
活跃值: (534)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
10
妖兽!
我一直以为是线程问题,,

因为env是线程隔离的,
2016-5-10 18:06
0
雪    币: 547
活跃值: (534)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
11
两份之间是有同步的,今天由于某些特别原因,找到了这个同步,具体如下

BaseDexClassLoader-->DexPathList-->makeDexElements-->loadDexFile-->DexFile.loadDex-->DexFile-->openDexFile-->openDexFileNative--> Dalvik_dalvik_system_DexFile_openDexFileNative-->addToDexFileTable-->dvmHashTableLookup(gDvm.userDexFiles,xx,xx,xx,true)-->Dex加入gDvm.userDexFiles
2016-8-19 12:36
0
雪    币: 133
活跃值: (587)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
12
这个才是正确
2016-8-23 18:51
0
雪    币: 94
活跃值: (2392)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
13
good~!
2016-8-24 09:25
0
游客
登录 | 注册 方可回帖
返回
//