嗨,我使用基于jscheme一个Android应用程序(方案的Droid),但如果你不熟悉它,也许你很熟悉Clojure的。在任何情况下,这些提供访问虚拟机(jvm,dalvik)。在计算机上(任何拱门或操作系统),我都可以动态加载自己编译的类。但是,当我尝试在Android(加载dex'ed罐子)我遇到问题我不能修复:因此负载JAR/DEX动态地从Android应用
> (define inner-url-array (array java.net.URL.class (java.net.URL. "file:///sdcard/Test.jar")))
# (file:///sdcard/Test.jar)
> (define systemClassLoader (ClassLoader.getSystemClassLoader))
dalvik.system.PathClassLoader[DexPathList[[directory "."],nativeLibraryDirectories=[/system/lib, /vendor/lib, /system/lib, /vendor/lib]]]
> (define arrlist (array java.lang.Class.class java.net.URL.class))
# (class java.net.URL)
> (define classLoaderClass java.net.URLClassLoader.class)
class java.net.URLClassLoader
> (define method (.getDeclaredMethod class LoaderClass "addURL" arrlist))
protected void java.net.URLClassLoader.addURL(java.net.URL)
> (.setAccessible method #t)
#null
> (.invoke method systemClassLoader inner-url-array)
Expected receiver of type java.net.URLClassLoader, but got dalvik.system.PathClassLoader
问题是ClassLoader.getSystemClassLoader
即使我尝试转换为URLClassLoader
类,它拒绝。然后我试图使用dalvik.system.DexClassLoader
代替
> (import "dalvik.system.*")
# t
> (define classloader (DexClassLoader. "/sdcard/Test.jar" "/sdcard" #null (.getParent (ClassLoader.getSystemClassLoader))))
,现在我得到这个错误!:
优化的数据目录/ SD卡不被当前用户拥有。共享存储无法保护您的应用程序免受代码注入攻击。
它为什么会拒绝写入SD卡?是否有另一种解决方案来加载这样的jar文件,或者至少扩展应用程序的类路径?
“托管应用程序将DEX下载到应用程序的内部存储器中”。一个人会怎么做?当然内部存储是一个不适用于任何其他应用程序,所以复制/粘贴不起作用。托管应用程序不会下载东西 – francogrex
@francogrex:“托管应用程序不下载东西” - 然后与托管应用程序的开发人员交谈,并要求他们添加一些内容以允许您执行您尝试的操作做。 – CommonsWare