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