javascript - PluginManager 中的 NullPointer 异常 - 创建自定义 Apache Cordova 插件 Echo.java

标签 javascript android apache cordova cordova-plugins

我一直在尝试从现有的 Echo 插件创建一个示例插件。我收到以下错误:

W/System.err(1894): java.lang.NullPointerException: cls == null
W/System.err(1894):     at java.lang.Class.isAssignableFrom(Native Method)
W/System.err(1894):     at org.apache.cordova.PluginManager.instantiatePlugin(PluginManager.java:489)
W/System.err(1894):     at org.apache.cordova.PluginManager.getPlugin(PluginManager.java:167)
W/System.err(1894):     at org.apache.cordova.PluginManager.exec(PluginManager.java:120)
W/System.err(1894):     at org.apache.cordova.CordovaBridge.jsExec(CordovaBridge.java:59)
W/System.err(1894):     at org.apache.cordova.engine.SystemExposedJsApi.exec(SystemExposedJsApi.java:41)
W/System.err(1894):     at com.android.org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method)
W/System.err(1894):     at com.android.org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:27)
W/System.err(1894):     at android.os.Handler.dispatchMessage(Handler.java:102)
W/System.err(1894):     at android.os.Looper.loop(Looper.java:136)
W/System.err(1894):     at android.os.HandlerThread.run(HandlerThread.java:61)
I/System.out(1894): Error adding plugin .
W/System.err(1894): java.lang.NullPointerException
W/System.err(1894):     at org.apache.cordova.PluginManager.getPlugin(PluginManager.java:169)
W/System.err(1894):     at org.apache.cordova.PluginManager.exec(PluginManager.java:120)
W/System.err(1894):     at org.apache.cordova.CordovaBridge.jsExec(CordovaBridge.java:59)
W/System.err(1894):     at org.apache.cordova.engine.SystemExposedJsApi.exec(SystemExposedJsApi.java:41)
W/System.err(1894):     at com.android.org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method)
W/System.err(1894):     at com.android.org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:27)
W/System.err(1894):     at android.os.Handler.dispatchMessage(Handler.java:102)
W/System.err(1894):     at android.os.Looper.loop(Looper.java:136)
W/System.err(1894):     at android.os.HandlerThread.run(HandlerThread.java:61)

以下是我的文件:

Echo.java

package com.gerald.example.sampleecho;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaInterface;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.CordovaWebView;
import org.json.JSONArray;
import org.json.JSONException;

import android.util.Log;

public class Echo extends CordovaPlugin {

    @Override
    public void initialize(CordovaInterface cordova, CordovaWebView webView)     {
        // TODO Auto-generated method stub
        super.initialize(cordova, webView);
        Log.d("SAMPLE_ECHO", "initializing");
    }

    @Override
    public boolean execute(String action, JSONArray args,
            CallbackContext callbackContext) throws JSONException {
        Log.d("SAMPLE_ECHO", action);
        if(action.equals("echo")){
            String message = args.getString(0);
            this.echo(message, callbackContext);
            return true;
        }

        return false;
    }



    private void echo(String message, CallbackContext callbackContext){
        Log.d("SAMPLE_ECHO", "Echoing...");
        if(message != null && message.length()>0){
                callbackContext.success(message);
        }else{
                callbackContext.error("Expected one non-empty string      argument.");
        }
    }
}

plugin.xml如下所示

插件.xml

<?xml version="1.0" encoding="UTF-8"?>
<plugin xmlns="http://www.phonegap.com/ns/plugins/1.0"
xmlns:android="http://schemas.android.com/apk/res/android"
id="com.gerald.example.sampleecho.echo"
version="1.2.2">

<name>SampleEcho</name>

<description>Echoes stuff</description>
<author>Oyudo Gerald</author>
<js-module src="www/echo.js" name="echo" >
    <clobbers target="myEcho"/>
</js-module>
<engines>
    <engine name="cordova" version="4.0.2"/>
</engines>
<!-- android -->
    <platform name="android">
        <config-file target="res/xml/config.xml" parent="/*">
            <feature name="Echo"
               value="com.gerald.example.sampleecho.Echo"/>
        </config-file>

        <source-file src="src/com/gerald/example/sampleecho/Echo.java"
                target-dir="src/com/gerald/example/sampleecho" />
    </platform>
</plugin>

和 HTML 代码

index.html

<html>
<head>
    <title>HelloWorld!</title>
    <meta charset="UTF-8">
    <meta http-equiv="Content-Security-Policy" content="default-src *;   style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'">        
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script type="text/javascript" src="cordova.js"></script>
    <script type="text/javascript">
        function onBodyLoad(){
            document.addEventListener("deviceready",onDeviceReady, false);
        }
        function onDeviceReady(){
             br = "<br />";         
             //Get the appInfo DOM element        
              var element = document.getElementById("appInfo");         
              ////Replace it with specific information about the device         
              ////running the application         
              element.innerHTML = 'Cordova Version: ' +            
                      device.cordova + br +            
                      'Platform: ' + device.platform + br +          
                      'Model: ' + device.model + br +           
                      'OS Version: ' + device.version;        

        }
        function doEcho(){
             myEcho.echo("Plugin installed successfully", function(message){
                  alert(message);
              });
        }
    </script>
</head>
    <body onload="onBodyLoad()">
        <h1>Hello World</h1>
        <p>This is a sample Cordova application</p>
        <p id ="appInfo">
            waiting for cordova initialization to complete
        </p>
        <button onclick="doEcho();">Please Echo</button>
    </body>
</html>

我正在使用 cordova 版本 4.0.2 和 JDK 8。 堆栈跟踪没有任何部分引用我的代码,所以我什至不知道从哪里开始。我哪里做错了?

我在 eclipse Debug模式下运行了 android 项目,我注意到我的插件类的字符串表示形式被传递给 CordovaWebViewImpl 并向下传递给 PluginManager,我猜这就是错误发生的原因。新问题是,为什么当我的插件通过 init() 方法从 CordovaInterface 传递到 CordovaWebViewImpl 时,pluginEntry 为 null?

最佳答案

而且……经过一整天的尝试,我通过研究ConfigXMLParser终于发现下面这个插件的特征格式无法读取。

<feature name="Echo"
           value="com.gerald.example.sampleecho.Echo"/>

而是使用以下内容:

<feature name="Echo">
    <param name="android-package" value="com.gerald.example.sampleecho.Echo" />
</feature>

关于javascript - PluginManager 中的 NullPointer 异常 - 创建自定义 Apache Cordova 插件 Echo.java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31748043/

相关文章:

Javascript 请求全屏是不可靠的

java - js可以调用java方法吗?

javascript - 合并字符串中的重复项并用逗号附加它会给出错误的输出

java - 在 Eclipse 中更新 ADT 导致许多错误

php - apache 环境变量中的配置变量

apache - 该站点指定了无效的 Strict-Transport-Security header - firebug

javascript - 使用脚本应用和更改所选 radio 的类名

android - 无法完成 Activity

java - 我下载的可绘制图像为空

linux - Redmine安装