DexClassLoader结构器如下所示:
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应用程序中复制这一功能,但是我无法成功地用DexClassLoader加载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]]当我使用MyMath.jar加载MainProgram.jar时,如何链接DexClassLoader库?
发布于 2016-03-03 04:25:16
这个库可能会有所帮助:dex/src/com/example/dex/DexInjector.java
首先,您可以通过以下方法将jar文件转换为dex文件
dx --dex --output ./MyMath_dex.jar ./MyMath.jar然后,您可以在Android中加载您的dex文件,有关更多信息,您可以在上面的库中阅读源代码。
https://stackoverflow.com/questions/35762358
复制相似问题