我使用以下代码将我的类动态加载到Android应用程序。 (注意:成功加载)
File file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
String fileInput = file.getAbsolutePath() + "/file.jar";
File optimizedDexOutputPath = activity.getDir("dex", Context.MODE_PRIVATE);
String fileOutput = optimizedDexOutputPath.getAbsolutePath();
DexClassLoader classLoader = new DexClassLoader(fileInput, fileOutput, null, getClass().getClassLoader());
try {
Class<?> helloClass = classLoader.loadClass("HelloClass");
Toast.makeText(activity, "Loaded success: " + helloClass.toString(), Toast.LENGTH_SHORT).show();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
我有以下cordova config.xml:
<feature name="HelloClass">
<param name="android-package" value="HelloClass" />
</feature>
当我从javascript调用execute方法时,我收到以下错误。
05-12 18:06:19.180:W / System.err(17862):java.lang.ClassNotFoundException:HelloClass 05-12 18:06:19.180:W / System.err(17862):引起:java.lang.NoClassDefFoundError:HelloClass 05-12 18:06:19.180:W / System.err(17862):... 13更多 05-12 18:06:19.190:W / System.err(17862):引起:java.lang.ClassNotFoundException:路径上没有找到“HelloClass”类:/data/app/sandbox.apk
我想知道这里出了什么问题。任何帮助都非常感谢。
答案 0 :(得分:0)
我假设你想从cordova插件动态加载外部类到android app。
从提到的内容来看,使用DexClassLoader加载类的方法似乎没问题。但是,要在从javascript调用它时使类可用,您需要在调用cordova执行方法后立即加载类。
您可以按如下方式修改现有的codova PluginManager.java:
private CordovaPlugin instantiatePlugin(String className) {
CordovaPlugin ret = null;
try {
Class<?> c = null;
if ("HelloClass".equals(className)) {
File file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
String fileInput = file.getAbsolutePath();
File optimizedDexOutputPath = this.ctx.getActivity().getDir("dex", Context.MODE_PRIVATE);
String fileOutput = optimizedDexOutputPath.getAbsolutePath();
DexClassLoader classLoader = new DexClassLoader(fileInput, fileOutput, null, getClass().getClassLoader());
try {
c = classLoader.loadClass(className);
ret = (CordovaPlugin) c.newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
else {
if ((className != null) && !("".equals(className))) {
c = Class.forName(className);
}
if (c != null & CordovaPlugin.class.isAssignableFrom(c)) {
ret = (CordovaPlugin) c.newInstance();
}
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("Error adding plugin " + className + ".");
}
return ret;
}
现在,您应该可以从.js中执行HelloClass中的方法而没有任何问题。