android – 如何从我的.apk文件中打包的jar文件中加载一个类?

android – 如何从我的.apk文件中打包的jar文件中加载一个类?,第1张

概述我试图从我的.apk文件的/ assets目录中的jar文件加载接口的插件实现.我能够让它工作的唯一方法是将jar文件解压缩到私有外部存储器,然后将该文件传递给DexClassLoader. 这有效,但为什么jar必须存在于两个地方(.apk和私人外部存储)? DexClassLoader必须以文件路径作为参数. 有没有办法给它一个直接路径到/ assets文件夹中的文件,这样我就不必使用外部存储 我试图从我的.apk文件的/ assets目录中的jar文件加载接口的插件实现.我能够让它工作的唯一方法是将jar文件解压缩到私有外部存储器,然后将该文件传递给DexClassLoader.

这有效,但为什么jar必须存在于两个地方(.apk和私人外部存储)? DexClassLoader必须以文件路径作为参数.

有没有办法给它一个直接路径到/ assets文件夹中的文件,这样我就不必使用外部存储来获取已存在的文件的额外副本?

以下是相关的代码段:

// somewhere in my main Activity ...  final file aExtractedDexfile = new file(getDir("dex",Context.MODE_PRIVATE),liBRARY_DEX_JAR);  extractDexTo(aExtractedDexfile);  loadlibraryProvIDer(aExtractedDexfile);

/** Extract the jar file that contains the implementation class.dex and place in private storage */private voID extractDexTo(file tJarInternalStoragePath) {  BufferedinputStream aJarinputStream = null;  OutputStream aDexOutputStream = null;  try {    aJarinputStream = new BufferedinputStream(getAssets().open(liBRARY_DEX_JAR));    aJarOutputStream = new bufferedoutputstream(new fileOutputStream(tJarInternalStoragePath));    byte[] buf = new byte[BUF_SIZE];    int len;    while ((len = aJarinputStream.read(buf,BUF_SIZE)) > 0)    {      aJarOutputStream.write(buf,len);    }    aJarOutputStream.close();    aJarinputStream.close();  } catch (IOException e) {    if (aDexOutputStream != null) {      try {        aJarOutputStream.close();      } catch (IOException ioe) {        ioe.printstacktrace();      }    }    if (aJarinputStream != null) {      try {        aJarinputStream.close();      } catch (IOException ioe) {        ioe.printstacktrace();      }    }  }}

/** Use DexClassLoader to load the classes from libraryProvIDer */private voID loadlibraryProvIDer(file tfile) {  // Internal storage where the DexClassLoader writes the optimized dex file to.  final file aOptimizedDexOutputPath = getDir("outdex",Context.MODE_PRIVATE);  // Initialize the class loader with the secondary dex file.  DexClassLoader cl = new DexClassLoader(tfile.getabsolutePath(),aOptimizedDexOutputPath.getabsolutePath(),null,getClassLoader());  Class<?> alibProvIDerClazz = null;  try {    // Load the library class from the class loader.    alibProvIDerClazz = cl.loadClass(liBRARY_PROVIDER_CLASS);          slibraryProvIDer = (libraryInterface) alibProvIDerClazz.newInstance();  } catch (Exception exception) {    // Handle exception gracefully here.    exception.printstacktrace();  }}
解决方法 有没有办法给它一个直接路径到/ assets文件夹中的文件,这样我就不必使用外部存储来获取已存在的文件的额外副本?

答案是否定的.我想您遵循this blog posted by official source实施您的代码.如果有更好的做事方式,那么bloger应该在他的博客中推荐它.

您需要optimizeDirectory的原因在in the API中解释:

This class loader requires an application-private,writable directory to cache optimized classes.

另请注意,资产目录在apk中不可写,因此无法使用纯资产目录.

你需要复制jar文件的原因有点微妙,在博客中提到:

First,it has to be copIEd to a storage location whose path can be supplIEd to the class loader.

嵌入在apk归档中的所有内容(文件夹/文件)在运行时无法公开(或可解释)到底层文件系统.换句话说,DexClassLoader和PathClassLoader构造函数中所需的dexPath需要一个实体路径字符串,如/data/data/com.example/dex/common-lib.jar,它表示文件系统中的文件.

总结

以上是内存溢出为你收集整理的android – 如何从我的.apk文件中打包的jar文件中加载一个类?全部内容,希望文章能够帮你解决android – 如何从我的.apk文件中打包的jar文件中加载一个类?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1135839.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存