1. 在Android project中,用eclipse生成.so文件/jni头文件,并调用。
参考系列文章:http://blog.youkuaiyun.com/jiuyueguang/article/details/9447245
尤其1.2。
遇到的问题见
http://blog.youkuaiyun.com/jiaoshengha/article/details/76881925
2. Android Project中加载第三方给的.so文件。
apk安装失败→确定.so库版本,arm x86 etc。。
3. 在PhoneGap工程中,像3一样添加libs/.so文件,调用弹出。
此为在java工程中调用,并非是plugin /js之类的使用方法。
是为了先确定.so文件可以在phonegap工程中使用。。。
4. 在PhoneGap中通过插件调用.so文件
先参考以下文章,创建phonegap插件
http://blog.youkuaiyun.com/jiaoshengha/article/details/76826490
jar文件参考 http://blog.youkuaiyun.com/fisherwan/article/details/27974229
http://blog.youkuaiyun.com/lyc_xiaochao/article/details/52947575
a. 将2中能使app运行的so文件拷贝到plugin src目录下
b. 新建.so对应的java文件HelloActivity.java,放plugin src目录下
c. 修改plugin.xml内容,增加src文件和.so文件。
注意:source-file标签中,src和target-dir的设置!!
PluginDemo.java的target-dir不需要改!
不需要改成跟HelloActivity.java对应!
需要跟PhoneGap插件feature-value中值对应!
HelloActivity.java的target-dir需要改成jni对应头文件的目录结构!
libs文件夹中包含需要的.so文件。
<?xml version='1.0' encoding='utf-8'?>
<plugin id="org.apache.plugindemo" version="1.0.0" xmlns="http://apache.org/cordova/ns/plugins/1.0" xmlns:android="http://schemas.android.com/apk/res/android">
<name>PluginDemo</name>
<js-module name="PluginDemo" src="www/PluginDemo.js">
<clobbers target="cordova.plugins.PluginDemo" />
</js-module>
<platform name="android">
<config-file parent="/*" target="res/xml/config.xml">
<feature name="PluginDemo">
<param name="android-package" value="org.apache.plugindemo.PluginDemo" />
</feature>
</config-file>
<config-file parent="/*" target="AndroidManifest.xml"></config-file>
<source-file src="src/android/PluginDemo.java" target-dir="src/org/apache/plugindemo" />
<source-file src="src/android/HelloActivity.java" target-dir="src/com/hello/hello" /> //jni头文件目录结构
<source-file src="src/android/libs/mips64/libhello.so" target-dir="libs/mips64"/>
<source-file src="src/android/libs/x86/libhello.so" target-dir="libs/x86"/>
</platform>
</plugin>
d. cd到工程路径,添加插件到PhoneGap工程
cordova plugin add ~/AndroidStudioProjects/cordova/plugin/PluginDemo
e. Android Studio打开PhoneGap android项目,编辑HelloActivity.java PluginDemo.java ,
其余PluginDemo.js index.js index.html与之前没.so文件的插件内容一样,附上只是怕万一丢了。。。。
HelloActivity.java 本地声明
package com.hello.hello;
public class HelloActivity {
public static native String sayHello();
}
PluginDemo.java
添加
import com.hello.hello.HelloActivty;
load .so file
调用.so库中sayHello()函数 message2 = new HelloActivity().sayHello();
package org.apache.plugindemo;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.CallbackContext;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import static java.lang.System.loadLibrary;
import com.hello.hello.HelloActivity; //add this
/**
* This class echoes a string called from JavaScript.
*/
public class PluginDemo extends CordovaPlugin {
static
{
loadLibrary("hello"); //add this
}
@Override
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
if (action.equals("coolMethod")) {
String message = args.getString(0);
String message2 = new HelloActivity().sayHello(); //add this
this.coolMethod(message2, 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.");
}
}
}
PluginDemo.js
var exec = require('cordova/exec');
exports.coolMethod = function(arg0, success, error) {
exec(success, error, "PluginDemo", "coolMethod", [arg0]);
};
index.js
function Plugindemo(){
cordova.plugins.PluginDemo.coolMethod(["success!"], success, error);
}
function success(msg){
console.log(msg);
alert(msg);
}
function error(){
console.log(msg);
alert(msg);
}
index.html
<body>
<h1>PhoneGap</h1>
<script type="text/javascript" src="cordova.js"></script>
<script type="text/javascript" src="js/index.js"></script>
<button οnclick="Plugindemo();">PluginDemo</button>
</body>
f. cordova run android 发现点击按钮弹出sayHello里内容啦~