参考:http://www.android100.org/html/201502/26/123364.html

首先第一个是 jar 文件的制作,Java 里面直接把 .class 文件打包到 .jar 文件里面就可以了,但是 Android 的 Dalvik VM 是不认 Java 的 byte code 的,所以不能直接这么打包,而要用 dx 工具转成 Dalvik byte code 才可以。当然,dx 工具转了之后,jar 包里面就不 是 .class 文件了,而是 .dex 文件。

第二个是,Android 里面虽然也提供了 URLClassLoader 的实现,但是并不能用。要动态加载其它类,可以用的 Class Loader 有: 
DexClassLoader,PathClassLoader,其中,DexClassLoader 可以加载 apk, jar 或者 dex 文件,例如:

代码如下:

File jarFile = new File("/sdcard/test.dex"); 
# if ( jarFile.exists() ) { 
DexClassLoader cl = new DexClassLoader(jarFile.toString(), "/sdcard/test", null, ClassLoader.getSystemClassLoader()); 
Class<?> c = cl.loadClass("xiaogang.test.Test"); 

但是 DexClassLoader 要求指定一个可写的目录,即 DexClassLoader 构造函数的第二个参数,在上例中是 /sdcard/test 
这个参数的含义是:directory where optimized DEX files should be written 
因为 Dalvik 在加载 dex 文件时,会动态进行优化,DexClassLoader 要求指定优化后 dex 文件存放的位置。

PathClassLoader 的限制要更多一些,它只能加载已经安装到 Android 系统中的 apk 文件,也就是 /data/app 目录下的 apk 文件。其它位置的文件加载的时候都会出现 ClassNotFoundException. 例如:

代码如下:

PathClassLoader cl = new PathClassLoader(jarFile.toString(), "/data/app/" , ClassLoader.getSystemClassLoader()); 

由于 PathClassLoader 会去读取 /data/dalvik-cache 目录下的经过 Dalvik 优化过的 dex 文件,这个目录的 dex 文件是在安装 apk 包的时候 由 Dalvik 生成的。例如,如果包的名字是 xiaogang.test,Android 应用安装之后都保存在 /data/app 目 录下,即 /data/app/xiaogang.test-1.apk,那么 /data/dalvik-cache 目录下就会生成 data@app@xiaogang.test-1.apk@classes.dex 文件。在调用 PathClassLoader 时,它就 会按照这个规则去找 dex 文件,如果你指定的 apk 文件是 /sdcard/test.apk,它按照这个规则就会去读 /data /dalvik-cache/sdcard@test.apk@classes.dex 文件,显然这个文件不会存在,所 以PathClassLoader 会报错。

在 Google 修正这个问题之前,我们要么就只能用 DexClassLoader,要么就只能用 PathClassLoader 加载已安装的 apk

接下来制作dex文件,用dx 命令生成 .dex 文件

1.dx 加入环境变量

dx路径   /sdk/android-sdk-macosx/tools:/Users/jianweiwang/Documents/dev/sdk/android-sdk-macosx/build-tools/22.0.1

用vim命令加入   vim ~/.bash_profile

source 命令 生效 source  ~/.bash_profile

2.执行命令

dx --dex --output ./TestClassLoader.dex ./TestClassLoader.class

但是出现错误:

UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dx.cf.iface.ParseException: bad class file magic (cafebabe) or version (0034.0000)at com.android.dx.cf.direct.DirectClassFile.parse0(DirectClassFile.java:472)at com.android.dx.cf.direct.DirectClassFile.parse(DirectClassFile.java:406)at com.android.dx.cf.direct.DirectClassFile.parseToInterfacesIfNecessary(DirectClassFile.java:388)at com.android.dx.cf.direct.DirectClassFile.getMagic(DirectClassFile.java:251)at com.android.dx.command.dexer.Main.processClass(Main.java:704)at com.android.dx.command.dexer.Main.processFileBytes(Main.java:673)at com.android.dx.command.dexer.Main.access$300(Main.java:83)at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:602)at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:170)at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144)at com.android.dx.command.dexer.Main.processOne(Main.java:632)at com.android.dx.command.dexer.Main.processAllFiles(Main.java:510)at com.android.dx.command.dexer.Main.runMonoDex(Main.java:280)at com.android.dx.command.dexer.Main.run(Main.java:246)at com.android.dx.command.dexer.Main.main(Main.java:215)at com.android.dx.command.Main.main(Main.java:106)
...while parsing TestDex.class

  参考:http://gaebolg.blog.163.com/blog/static/19826906820138544049440/

http://stackoverflow.com/questions/24662801/bad-class-file-magic-or-version

原因 我用javac 编译的class文件 java 环境是1.8

解决方法 :

用eclipse 导出个 1.6的class 继续执行命令  dx --dex --output ./TestDex.dex .

出现错误

UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dx.cf.iface.ParseException: class name (com/example/testactivity/TestDex) does not match path (com/example/TestDex.class)at com.android.dx.cf.direct.DirectClassFile.parse0(DirectClassFile.java:520)at com.android.dx.cf.direct.DirectClassFile.parse(DirectClassFile.java:406)at com.android.dx.cf.direct.DirectClassFile.parseToInterfacesIfNecessary(DirectClassFile.java:388)at com.android.dx.cf.direct.DirectClassFile.getMagic(DirectClassFile.java:251)at com.android.dx.command.dexer.Main.processClass(Main.java:704)at com.android.dx.command.dexer.Main.processFileBytes(Main.java:673)at com.android.dx.command.dexer.Main.access$300(Main.java:83)at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:602)at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:170)at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:229)at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:158)at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:229)at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:158)at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:229)at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:158)at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144)at com.android.dx.command.dexer.Main.processOne(Main.java:632)at com.android.dx.command.dexer.Main.processAllFiles(Main.java:510)at com.android.dx.command.dexer.Main.runMonoDex(Main.java:280)at com.android.dx.command.dexer.Main.run(Main.java:246)at com.android.dx.command.dexer.Main.main(Main.java:215)at com.android.dx.command.Main.main(Main.java:106)
...while parsing com/example/TestDex.class

  类文件夹不一致

建立相应文件夹执行

com/example/testactivity/执行dx命令 成功生成:TestDex.dex

转载于:https://www.cnblogs.com/wjw334/p/4874161.html

.java生成dex文件相关推荐

  1. 【Android 安全】DEX 加密 ( Java 工具开发 | 解压 apk 文件 | 加密生成 dex 文件 | 打包未签名 apk 文件 | 文件解压缩相关代码 )

    文章目录 一.解压 apk 文件 二.加密生成 dex 文件 三.打包未签名 apk 文件 四.完整代码示例 五.文件解压缩相关代码 六.执行结果 参考博客 : [Android 安全]DEX 加密 ...

  2. 【Android 安全】DEX 加密 ( Java 工具开发 | 生成 dex 文件 | Java 命令行执行 )

    文章目录 一.生成 dex 文件 二.生成 dex 文件代码示例 三.生成 dex 结果 参考博客 : [Android 安全]DEX 加密 ( 常用 Android 反编译工具 | apktool ...

  3. dx 生成 DEX文件流程分析

    dx 生成 DEX文件流程分析 命令 dx -JXms16M -JXmx2048M --dex   --output=. /classes.dex     ./classes.jar dalvik/d ...

  4. 超详细的java生成excel文件并下载

    在网上随手一搜,可以搜到很多java生成excel文件相关的博客,但每个都有不同,核心点说清楚了,但具体运用的时候,相信大家或多或少都没法一次直接运用,这样每次去找并且运用的时候很费时间,所以这也是我 ...

  5. POI以SAX方式解析Excel2007大文件(包含空单元格的处理) Java生成CSV文件实例详解...

    http://blog.csdn.net/l081307114/article/details/46009015 http://www.cnblogs.com/dreammyle/p/5458280. ...

  6. zipentry压缩乱码linux,java生成压缩文件 ZipEntry出现乱码的有关问题

    java生成压缩文件 ZipEntry出现乱码的问题 在项目中,一次导出的文件有好几个,而且文件内容比较大,最后考虑到把文件进行压缩在下载,开始试用JDK自带的ZIP压缩包时,ZipEntry ze ...

  7. java流与文件——java生成解压缩文件(夹)

    [0]README 0.1) 本文描述转自 http://blog.csdn.net/chenssy/article/details/9622171 , 旨在理解 java流与文件--java生成解压 ...

  8. java 生成csv文件_Java生成CSV文件实例详解

    本文实例主要讲述了java生成csv文件的方法,具体实现步骤如下: 1.新建csvutils.java文件: package com.saicfc.pmpf.internal.manage.utils ...

  9. Java生成ics文件

    java生成ICS文件,这玩意好象是个什么日程表类的东西.可以导入到outlook里面用. public void exportActivityDates(HttpServletRequest req ...

最新文章

  1. c语言gather函数,TensorFlow函数:tf.gather_nd
  2. 关于onreadystatechange属性(转)
  3. Phonegap win7下环境配置流程
  4. aws lambda使用_使用AWS Lambda,S3和AWS CloudFront进行动态内容缓存
  5. 利用modelarts和物体检测方式识别验证码
  6. excel两个指标相关性分析_我用Excel发现了数据分析的本质:回归分析
  7. 特斯拉将美国政府告了:要求停止对华关税并退款!
  8. Vue学习笔记(五)—— 状态管理Vuex
  9. 最简单的图文教程,几步完成Git的公私钥配置
  10. python运算符及优先级顺序
  11. 堆栈小应用(一):括号匹配程序
  12. opencore(OC引导)关于修改sle系统权限的问题
  13. CAPL可以读写的几种文件
  14. TCP报文段和连接方式
  15. 苹果开发者中心如何上传构建版本
  16. Timer Class(计时器类别)
  17. 【学术相关】交大博士学长:研究生计算机专业的方向选择!
  18. ibm服务器做系统按f几,这是我的主板,请问开机启动热键按F几?
  19. 前端体系结构知识概括
  20. 游戏开发笔记(二)——开发流程和项目管理

热门文章

  1. WebLogic下载地址
  2. 修复 SyntaxHighlighter 3.0.83 Java 代码多行注释 Bug
  3. How to become an expert in the IP industry? Here is where you should start
  4. formal method online checking tool
  5. 最佳的七十五个网络分析和安全工具
  6. sed 和 awk 的一些用法
  7. mysql主从复制-mysqldump
  8. 在linux中安装mysql时遇到的问题
  9. Angular基础(五) 内建指令和表单
  10. SpringMvc 集成 shiro 实现权限角色管理-maven