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