日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

.java生成dex文件

發布時間:2025/3/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .java生成dex文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

參考: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文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。