Mal*_*ley 6 c++ android cordova cordova-plugins visual-studio-cordova
我正在使用Visual Studio 2015中的Apache Cordova开发一个针对Windows 10和Android的应用程序.后端逻辑将包含在一个c ++项目中,希望根据平台编译成.so或.dll.
我已经为Android的Cordova插件做了一些研究,但是没有任何好的教程.我需要做什么(在c ++和javascript方面)连接两个代码库?
经过一些研究和大量的死胡同,我能够在Cordova上运行我的C++代码.我在这里回复记录我的一些问题,并为尝试类似事情的其他人提供一些好的资源.
Cordova插件开发
一个很好的教程,比官方文档更好地解释了插件的每个部分:https://blogs.oracle.com/mobile/entry/introduction_to_custom_cordova_plugin
这部分开发的最大问题是VS 2015中的Cordova插件删除工作很糟糕,有时会在错误的地方查找文件.如果您需要更改插件xml文件,请注意这一点.
与C++通信
我使用VS将代码构建到.so共享库中(新项目 - > android共享库).确保在ARM中构建它,而不是在x86或其他配置中构建它.将.so文件放在/ libs/armeabi中,以便.java文件可以使用loadLibrary()方法找到它.
这是我的.java文件,用于从库中加载和调用函数:
package com.example.plugin.cpp;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import org.apache.cordova.CordovaArgs;
import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.CordovaWebView;
import org.apache.cordova.CordovaInterface;
import org.apache.cordova.PluginResult;
import org.json.JSONObject;
import org.json.JSONArray;
import org.json.JSONException;
public class Cpp extends CordovaPlugin {
public static final String ACTION_SEVEN = "seven";
public Cpp() { }
@Override
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) {
if (ACTION_SEVEN.equals(action)) {
alert("Message from Java", "Grabbed the number " + get7() + " from C++", "dismiss", callbackContext);
callbackContext.success();
return true;
}
return false;
}
private synchronized void alert(final String title,
final String message,
final String buttonLabel,
final CallbackContext callbackContext) {
new AlertDialog.Builder(cordova.getActivity())
.setTitle(title)
.setMessage(message)
.setCancelable(false)
.setNeutralButton(buttonLabel, new AlertDialog.OnClickListener() {
public void onClick(DialogInterface dialogInterface, int which) {
dialogInterface.dismiss();
callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, 0));
}
})
.create()
.show();
}
public native int get7();
static {
System.loadLibrary("CppLibrary");
}
}
Run Code Online (Sandbox Code Playgroud)
这是相应的C++代码:
CppLibrary.cpp:
#include "CppLibrary.h"
extern "C" {
JNIEXPORT int JNICALL Java_org_example_plugin_cpp_Cpp_get7(JNIEnv* env, jobject thiz)
{
return 7;
}
}
Run Code Online (Sandbox Code Playgroud)
Cpp.h:
#pragma once
extern "C" {
JNIEXPORT int JNICALL Java_org_example_plugin_cpp_Cpp_get7(JNIEnv* env, jobject thiz);
}
Run Code Online (Sandbox Code Playgroud)
C端实现资源:
http://developer.android.com/ndk/samples/sample_hellojni.html#ci
http://developer.android.com/training/articles/perf-jni.html#faq_ULE
| 归档时间: |
|
| 查看次数: |
4049 次 |
| 最近记录: |