2016-03-03 56 views
0

的DexClassLoader構造器看起來是這樣的:DexClassLoader作爲libraryPath的輸入需要什麼?

public DexClassLoader (String dexPath, String optimizedDirectory, String libraryPath, ClassLoader parent) 

是什麼DexClassLoader希望傳遞的libraryPath(除了null)?

是否可以將外部庫作爲參數傳遞給DexClassLoader?如果是這樣,libraryPath參數的行爲類似於java的-classpath cmd行選項?我寫了一個簡單的java應用程序,將一個jar文件作爲外部庫引用,現在我想在android應用程序中複製行爲。

我有一個數學函數的jar:MyMath.jar - 包含一個類「Add」和一個方法「add」。在我的主程序中,我從MyMath.jar中導入「mymath」包,創建Add類的一個實例並調用它的add方法。

要建立我使用: javac的-classpath ../lib/MyMath.jar MainProgram.java

運行我用: 的java -classpath; ../的lib/MyMath.jar MainProgram

這成功地利用MyMath.jar訪問我的主程序中的「Add」類。現在我需要在一個Android應用程序複製這一點,但我無法成功加載MyMath.jar與DexClassLoader,這裏是我的實現:

DexClassLoader classloader = new DexClassLoader("/storage/sdcard/Download/MainProgram.jar", codeCacheDir.getAbsolutePath(), "/storage/sdcard/Download/MyMath.jar", ClassLoader.getSystemClassLoader()); 

我可以實例化類和調用它的方法是不依賴於「 MyMath.jar」與類加載器,但我不能調用那些依賴於MyMath.jar方法

這裏是拋出的異常,當我嘗試調用取決於MyMath.jar的方法:

java.lang.reflect.InvocationTargetException              at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    ... 
Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/mymath/Add; 
    ... 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)  
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.mymath.Add" on path: DexPathList[[zip file "/storage/sdcard/Download/MainProgram.jar"],nativeLibraryDirectories=[/vendor/lib64, /system/lib64]] 

當我使用DexClassLoader加載MainProgram.jar時,如何鏈接MyMath.jar庫?

+0

DexClassLoader無法從jar中加載jvm類。事實上,Android中沒有加載jvm類的機制。 Android應用程序需要將類轉換爲dalvik並捆綁到dex文件中。 –

+0

我已經使用「dx --dex --output ./dexJar.jar ./orig.jar」將我的jar文件轉換爲dalvik可執行格式,並且能夠從我的jar文件中訪問,實例化和調用方法。我的問題是當我使用DexClassLoader時如何鏈接庫? –

回答

0

DexClassLoader的第一個參數發生在「列表包含類和資源,通過File.pathSeparator分隔,默認爲JAR/APK文件‘:’在Android」

的解決方案是簡單地串聯MyMath.jar添加到我的MainProgram.jar中:

final DexClassLoader classloader = new DexClassLoader(
"/storage/sdcard/Download/MainProgram.jar" + ":" + 
"/storage/sdcard/Download/MyMath.jar", 
codeCacheDir.getAbsolutePath(), 
null, 
ClassLoader.getSystemClassLoader());