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成功加载MyMath.jar,这是我的实现:
DexClassLoader classloader = new DexClassLoader("/storage/sdcard/Download/MainProgram.jar", codeCacheDir.getAbsolutePath(), "/storage/sdcard/Download/MyMath.jar", ClassLoader.getSystemClassLoader());
我可以实例化类并使用classloader调用不依赖于“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 :(得分:0)
首先,您可以通过
将您的jar文件转换为dex文件dx --dex --output ./MyMath_dex.jar ./MyMath.jar
然后,您可以在Android中加载您的dex文件,有关详细信息,您可以阅读上面库中的源代码。
答案 1 :(得分:0)
DexClassLoader的第一个参数包含“ list 包含类和资源的jar / apk文件,由File.pathSeparator分隔,在Android”上默认为“:” / p>
解决方案是简单地将MyMath.jar连接到MainProgram.jar:
final DexClassLoader classloader = new DexClassLoader(
"/storage/sdcard/Download/MainProgram.jar" + ":" +
"/storage/sdcard/Download/MyMath.jar",
codeCacheDir.getAbsolutePath(),
null,
ClassLoader.getSystemClassLoader());