如何将cordova插件动态加载到Android应用程序中

时间:2015-05-12 09:22:38

标签: java android cordova cordova-plugins

我使用以下代码将我的类动态加载到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

我想知道这里出了什么问题。任何帮助都非常感谢。

1 个答案:

答案 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中的方法而没有任何问题。