Android:在运行时从assets文件夹中放置的jar文件加载自定义类

时间:2013-11-22 12:20:47

标签: android jar dexclassloader

我正在开发一个从资产中读取excel文件的Android应用程序。我使用POI-3.9库来读取.xls文件并且工作正常。然后我也必须阅读.xlsx文件,所以我添加了其他jar文件,如poi-ooxml-schemas-3.9.jar,poi-ooxml-3.9.jar,log4j.jar ...等。但是当我尝试构建时应用程序,日食冻结和崩溃。然后我尝试使用命令行构建项目,它揭示了dex文件的限制错误,它可以有最多64K方法,我的项目超过66K。然后我尝试删除一些jar文件,找出哪个文件有这么大的方法,发现它是poi-ooxml-schemas-3.9.jar。所以我计划将poi-ooxml-schemas-3.9.jar文件放在assets文件夹中,并使用DexClassLoader api加载jar。但它每次都会给出ClassNotFoundException,即使在调试时我可以看到DexClassLoader实例中的一些类名条目。我不知道我哪里出错了。我的jar文件是否以错误的格式被DexClassLoader或其他东西读取?这是我正在使用的示例代码:

    public class MainActivity extends Activity {

    @SuppressLint("NewApi")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        File dexInternalStoragePath = new File(getDir("dex", Context.MODE_PRIVATE), "dexx.jar");
        BufferedInputStream bis = null;
        OutputStream dexWriter = null;

        final int BUF_SIZE = 8 * 1024;
        try {
            bis = new BufferedInputStream(getAssets().open("dexx.jar"));
            dexWriter = new BufferedOutputStream(
                    new FileOutputStream(dexInternalStoragePath));
            byte[] buf = new byte[BUF_SIZE];
            int len;
            while((len = bis.read(buf, 0, BUF_SIZE)) > 0) {
                dexWriter.write(buf, 0, len);
            }
            dexWriter.close();
            bis.close();


            // Internal storage where the DexClassLoader writes the optimized dex file to
            final File optimizedDexOutputPath = getDir("dex", Context.MODE_PRIVATE);

            DexClassLoader cl = new DexClassLoader(dexInternalStoragePath.getAbsolutePath(),
                                                    optimizedDexOutputPath.getAbsolutePath(),
                                                    null,
                                                    getClassLoader());

            Class myLibraryClazz = cl.loadClass("org.apache.poi.openxml4j.opc.OPCPackage");


        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }
}

0 个答案:

没有答案