首页
社区
课程
招聘
[旧帖] Android开发关于android.jar库不全的问题 0.00雪花
发表于: 2015-9-3 17:15 3882

[旧帖] Android开发关于android.jar库不全的问题 0.00雪花

2015-9-3 17:15
3882
最近用android4.2.2版本库做开发,发现android.jar中很多类包含的函数,和安卓源码中比较起来都不全。比如我需要的,dalvik.system.DexFile.getClassNameList和defineClass等函数就没有。



我百度了下,找到了sdk中倒是有个layoutlib.jar,里面有dalvik.system.DexFile.getClassNameList和defineClass等函数。


于是我在工程中同时引入了这两个库:android.jar和layoutlib.jar。

我是利用反射调用的函数,代码是这样:
private String[] getClassNameList(int cookie) {
            Log.i(TAG,"dexFileClassName-"+DexFile.class.getName());
        return (String[]) RefInvoke.invokeStaticMethod(DexFile.class.getName(),
                          "getClassNameList", new Class[] { int.class },new Object[] { cookie });
}
   
private Class defineClass(String name, ClassLoader loader, int cookie) {
        return (Class) RefInvoke.invokeStaticMethod(DexFile.class.getName(),
                          "defineClass", new Class[] { String.class, ClassLoader.class,int.class },
                          new Object[] { name, loader, cookie });
}

运行后却依然提示找不到getClassNameList()方法,我想这两个库中都有dalvik.system.DexFile可能编译器分不清,于是我又交换了jar包加载顺序还是找不到getClassNameList()。各位高手,请问我该如何指定ClassLoader只加载layoutlib.jar中的dalvik.system.DexFile而不加载android.jar中的dalvik.system.DexFile呢?另外,我还重新编译了4.2.2源码,得到的android.jar中依然没有getClassNameList()方法,是我编译错误了还是本来就不在这里?谢谢!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 158
活跃值: (196)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
203    /**
204     * See {@link #loadClass(String, ClassLoader)}.
205     *
206     * This takes a "binary" class name to better match ClassLoader semantics.
207     *
208     * @hide
209     */
210    public Class loadClassBinaryName(String name, ClassLoader loader) {
211        return defineClass(name, loader, mCookie);
212    }
213
214    private native static Class defineClass(String name, ClassLoader loader, int cookie);

/* return a String array with class names */
248    native private static String[] getClassNameList(int cookie);
2015-9-3 17:53
0
雪    币: 87
活跃值: (88)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
我也看到源码中函数注释中有,另外在DexFile.java中是这么引用的
private native static void defineClass(String name, ClassLoader loader, int cookie);

可是至今没找到配合此native的loadLibrary,请问这个loadLibrary在源码何处?Android.mk中如何配置?
2015-9-3 19:23
0
雪    币: 158
活跃值: (196)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
dvm.so
2015-9-4 10:51
0
雪    币: 87
活跃值: (88)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
能否具体写下如何引用dvm.so?

自定义的类没法用loadLibrary,因为貌似dvm.so中的函数是这么写的Dalvik_dalvik_system_DexFile_getClassNameList...
已经规定好了它只能在Dalvik.dalvik.system.DexFile中被引用。

我做了实验,写成这样:
public native static String[] getClassNameList(int cookie);

static {
    System.loadLibrary("dvm");
}

报错:No implementation found for native Lcom/dvmtest/test/MyClassLoder;.getClassNameList:(I)[Ljava/lang/String;
2015-9-4 16:15
0
游客
登录 | 注册 方可回帖
返回
//