其实之前也转载过一篇关于使用plugman添加MyMath插件的文章,照着那篇文章的确可以添加MyMath插件,但是本人比较偏执不喜欢文章中用到的SimpleMath作为插件id,同时也想把自定义插件放在自定义package路径下统一管理,而不是放在SimpleMath对应的路径下,那么就碰到一系列的坑了,而本文正是在解决这些坑的过程中的经验总结。本文要做的是通过plugman生成MyMath插件,其中插件id为custom-plugin-math,并且MyMath插件放在com.yoryky.demo.plugins目录下。
1、plugman生成MyMath插件
这里先假设已经有了一个corodva工程项目,项目package为com.yoryky.demo。首先cd 到项目plugins目录,然后通过plugman命令创建MyMath控件
plugman create --name MyMath --plugin_id custom-plugin-math --plugin_version 1.0.0
接着cd到MyMath目录下,添加android平台
plugman platform add --platform_name android
可以看见在plugins目录下生成了MyMath控件目录,将目录名改为custom-plugin-math,然后在其下的src/android目录下修改MyMath.java文件,文件内容为
package com.yoryky.demo.plugins;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.CallbackContext;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
/**
* This class echoes a string called from JavaScript.
*/
public class MyMath extends CordovaPlugin {
@Override
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
if (action.equals("coolMethod")) {
String message = args.getString(0);
this.coolMethod(message, callbackContext);
return true;
}
return false;
}
private void coolMethod(String message, CallbackContext callbackContext) {
if (message != null && message.length() > 0) {
callbackContext.success(message);
} else {
callbackContext.error("Expected one non-empty string argument.");
}
}
}
修改MyMath.js文件内容为:
var exec = require('cordova/exec');
var myMathFunc = function(){};
myMathFunc.prototype.plus = function(success, error, arg0) {
exec(success, error, "MyMath", "plus", arg0);
};
myMathFunc.prototype.minus = function(success, error, arg0) {
exec(success, error, "MyMath", "minus", arg0);
};
var MYMATHFUNC = new myMathFunc();
module.exports = MYMATHFUNC;
然后在custom-plugin-math下创建,package.json文件,文件内容为
{
"name": "custom-plugin-math",
"version": "1.0.0",
"description": "test to see if can install custom plugin",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "yjing",
"license": "Apache-2.0"
}
接着是重头戏了,就是修改MyMath的plugin.xml配置文件,先直接贴出来,修改后的内容吧。
<?xml version='1.0' encoding='utf-8'?>
<plugin id="custom-plugin-math" version="1.0.0" xmlns="http://apache.org/cordova/ns/plugins/1.0" xmlns:android="http://schemas.android.com/apk/res/android">
<name>MyMath</name>
<js-module name="MyMath" src="www/MyMath.js">
<clobbers target="cordova.plugins.mymath"/>
</js-module>
<platform name="android">
<config-file parent="/*" target="res/xml/config.xml">
<feature name="MyMath">
<param name="android-package" value="com.yoryky.demo.plugins.MyMath"/>
</feature>
</config-file>
<config-file parent="/*" target="AndroidManifest.xml"/>
<source-file src="src/android/MyMath.java" target-dir="src/com/yoryky/demo/plugins"/>
</platform>
</plugin>
其中主要修改了clobbers标签的target值,它代表着在js中调用MyMath插件的方法;然后是feature标签的内嵌param标签的value值,它对应的是MyMath.java在android项目中的package+插件名;另外还改动了source-file标签的src值,它对应了android项目中MyMath.java文件的相对目录路径。
2、cordova项目添加插件
创建好MyMath插件后,就是添加到项目中了,先cd到cordova项目根目录,然后通过以下命令添加
cordova plugin add ../custom-plugin-math
这次测试,发现使用该命令直接添加成功了,不过之前测试时提示未发现plugin.xml文件的错误,而且到custom-plugin-math目录下发现第一步创建的几个文件都被删掉了,于是重新按第一小节方法创建好MyMath插件,并将custom-plugin-math目录移到其它地方,再通过cordova plugin add 方法添加新移到的位置,然后添加成功。在这里提一下,以备忘吧。
添加插件成功后,到项目中查看,会发现MyMath.java文件已经自动添加到了com.yoryky.demo.plugins包下。并且assets/plugins目录下也多了一个custom-plugin-math.www的目录,其下是我们创建的MyMath.js文件。另外插件还被自动配置到了cordova_plugins.js以及res/xml/config.xml两个文件中。
但时当打开MyMath.java文件时,文件报错,发现是其package居然是custom_plugin_math,将其修改为com.yoryky.demo.plugins。另外提示R包找不到,clean一次就好,不过有时候得注意,是不是cordova命令导致androidmanifest.xml文件的package值被修改。
3、测试插件是否添加成功
按照道理,只要第二部,添加成功了,插件使用就没有问题了。这里还是给一个简单的测试代码吧。
index.js文件的js部分代码:
function plustest(){
cordova.plugins.mymath.plus(success,fail,[5,6]);
}
function success(msg){
alert(msg);
}
function fail(msg){
alert(msg);
}
index.html文件部分代码:
<button onclick = "plustest()">5 + 6 求值</button>
运行cordova项目,然后可测试返回输出11,当然也可以在android studio上直接运行。有个地方需要提醒,就是在运行cordova命令时,有些cordova外层文件会覆盖android项目文件,并且会修改android项目的一些配置,这个一定要注意。
4、参考文件
本文基本都是参考自己之前博客的东西,也贴出来吧,毕竟这篇文章有些地方还是说的不详细。
1、http://blog.csdn.net/yoryky/article/details/78433400
2、http://blog.csdn.net/yoryky/article/details/73504272