15094


Cordova Pluginを開発しているのですが、  
Androidで確認したところ以下のエラーが発生し、Nativeコードまで処理がいきません。

[code]

    Uncaught ReferenceError: test is not defined at file:///android_asset/www/js/index.js:24
    
[/code]

この類の原因は、おそらく.xmlの設定ミスやファイルの置き場所などが考えられますが、test.jsはbuildまたはrunしてもしっかりとwww/jsのディレクトリに存在しています。

また、ソース類は以下のようになっております。

【plugin.xml】

[code]

    <?xml version="1.0" encoding="utf-8"?>
    <plugin xmlns="http://www.phonegap.com/ns/plugins/1.0"
        id="cordova-plugin-test"
        version="1.0.0">
    
    <name>cordova plugin test</name>
    
    <engines>
      <engine name="cordova" version=">=3.1.0"/>
    </engines>
    
    <asset src="www/test.js" target="js/test.js"/>
    
    <js-module src="www/test.js" name="test">
       <clobbers target="test" />
    </js-module>
    
    <!-- pratform add android -->
    <platform name="android">
    
    <config-file target="res/xml/config.xml" parent="/*">
      <feature name="CordovaPluginTest">
        <param name="android-package" value="com.example.test.CordovaPluginTest"/>
      </feature>
    </config-file>
    
    <source-file src="src/android/Test.java" target-dir="src/com/example/test"/>
    
    </platform>
    
    </plugin>
    
[/code]

【index.html】

[code]

    <html>
    <head>
        <meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *">
        <meta name="format-detection" content="telephone=no">
        <meta name="msapplication-tap-highlight" content="no">
        <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width">
    
        <link rel="stylesheet" type="text/css" href="css/index.css">
        <title>Hello World</title>
    
    </head>
    <body>
        <div class="app">
            <h1>Apache Cordova</h1>
            <div id="deviceready" class="blink">
                <p class="event listening">Connecting to Device</p>
                <p class="event received">Device is Ready</p>
            </div>
    
            <input type="button" value="test" onClick="cordovaPlugin()">
    
        </div>
    
        <script type="text/javascript" src="cordova.js"></script>
        <script type="text/javascript" src="js/index.js"></script>
        <script type="text/javascript" src="js/test.js"></script>
    
    </body>
    </html>
    
[/code]

【index.js】

[code]

    var app = {
        initialize: function() {
            this.bindEvents();
        },
        bindEvents: function() {
            document.addEventListener('deviceready', this.onDeviceReady, false);
        },
        onDeviceReady: function() {
            app.receivedEvent('deviceready');
        },
        receivedEvent: function(id) {
            var parentElement       =   document.getElementById(id);
            var listeningElement    =   parentElement.querySelector('.listening');
            var receivedElement     =   parentElement.querySelector('.received');
    
            listeningElement.setAttribute('style', 'display:none;');
            receivedElement.setAttribute('style', 'display:block;');
    
            console.log('Received Event: ' + id);
        }
    };
    
    function cordovaPlugin(){
        test.sendPlugin("test", success, error);
    }
    
    var success = function(message) {
        alert(message);
    }
    
    var failure = function() {
        alert("Error calling test Plugin");
    }
    
    app.initialize();
    
[/code]

【test.js】

[code]

    var exec        =   require('cordova/exec');
    var platform    =   require('cordova/platform');
    module.exports  =   {
        sendPlugin: function (message, successCallback, errorCallback) {
            exec(successCallback, errorCallback, "test", "Cordova Plugin!!", [message]);
        }
    }
    
[/code]

【Test.java】

[code]

    public class Test extends CordovaPlugin {
        @Override
        public boolean execute(String action, JSONArray data, CallbackContext callbackContext) throws JSONException {
            if (action.equals("test")) {
                String name = data.getString(0);
                callbackContext.success(name);
                return true;
            } 
            return false;
        }
    }
    
[/code]

このUncaught
ReferenceErrorについて結構調べたのですが、大体の回答に以下のソースをhtmlに追加するように言われてましたが、公開されているCordova
Pluginの中には記述なしのものもありますので、自作したPlugin関係のファイル等をplugin.xmlにしっかり記述をしておけば、特に関係ないと認識しております。

[code]

        <script type="text/javascript" src="js/test.js"></script>
    
[/code]

Cordovaの公式HPのガイドとcordova-plugin-helloを参考に、cordova plagin
addが正常に追加動作できるところまでプロジェクトを作成しましたが、それでも現状から変わることはできませんでした。

  * cordova-plugin-hello
  * <https://github.com/don/cordova-plugin-hello>

お手数おかけいたしますが、  
この問題を解決する方法をお教えください、よろしくお願いいたします。


CC BY-SA 3.0
2015-08-31T12:01:51.543
15082
2015-08-31T15:37:03.980
2015-08-31T12:07:54.753
11154
11154
question
javascript android html cordova
Cordova Uncaught ReferenceError: test is not defined at file:///android_asset/www/js/index.js:24


plugin.xmlに

`<clobbers target="test" />`  
と記述されているので、index.jsの24行目は

[code]

    function cordovaPlugin(){
        window.test.sendPlugin("test", success, error);
    }
    
[/code]

のように、windowをつける必要がある気がします


CC BY-SA 3.0
2015-08-31T15:37:03.980
15094
2015-08-31T15:37:03.980
845
15082
answer