能力值:
( LV12,RANK:270 )
|
-
-
2 楼
实际上Android(4.4.4,别的版本源码没看过)系统维护了两份dex cookie,一份在Java层的BaseDexClassLoader类里面(笑而不语。。。),另一份在Native层gDvm.userDexFiles里面。
目前两份没有同步,所以在Java层加载dex之后,Native层获取不到。
解决办法,要么在Native层调Java的方法(BaseDexClassLoader.findClass),要么在Native加载dex。
|
能力值:
( LV12,RANK:270 )
|
-
-
3 楼
补充以下,libdvm.so里面有个jni函数叫Dalvik_dalvik_system_DexFile_openDexFile,用这个函数加载,可以直接用env->FindClass找到,至于Java层怎么用,自己查查吧,我不知道
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
感谢提醒,之前就发现了BaseDexClassLoader,但是没有注意这个类的区别。
一语点醒。
|
能力值:
( LV3,RANK:30 )
|
-
-
5 楼
是不是Dalvik_dalvik_system_DexFile_openDexFile只能用于4.0以上的系统?
|
能力值:
( LV12,RANK:270 )
|
-
-
6 楼
2.3也有这个函数。有一个Dalvik_dalvik_system_DexFile_openDexFile_bytearray是4.0之后才添加的。
|
能力值:
( LV3,RANK:30 )
|
-
-
7 楼
按照你说的我在java层获取到了动态加载的类传递到Jni函数
然后使用env->RegisterNatives 注册函数 还是会提示
ERROR: Unable to find decl for native xxx
估计还是没同步的原因,不知道还有没有其他方法...
我没有在Jni层加载dex 是怕兼容性不好 所以在java层加载...
|
能力值:
( LV12,RANK:270 )
|
-
-
8 楼
env->FindClass返回的实际上是一个LocalReference,RegisterNatives的参数也是。
目测你是结构没搞对。
|
能力值:
( LV8,RANK:130 )
|
-
-
9 楼
大神谢谢分享
|
能力值:
( LV7,RANK:100 )
|
-
-
10 楼
妖兽!
我一直以为是线程问题,,
因为env是线程隔离的,
|
能力值:
( 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
|
能力值:
( LV4,RANK:40 )
|
-
-
12 楼
这个才是正确
|
能力值:
( LV3,RANK:30 )
|
-
-
13 楼
good~!
|
|
|