1

我正在开发一个从资产中读取 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();
        }


    }
}
4

0 回答 0