在 Apache Cordova for Android 中访问C++代码



我正在开发一个针对Windows 10和Android的应用程序,使用Visual Studio 2015中的Apache Cordova。后端逻辑将包含在 c++ 项目中,该项目有望根据平台编译为 .so 或 .dll。

我已经对适用于Android的Cordova插件进行了一些研究,但没有任何好的教程。我具体需要做什么(在 c++ 和 javascript 端(来连接两个代码库?

经过更多的研究和很多死胡同,我能够让我的C++代码在科尔多瓦上运行。我在这里回复是为了记录我的一些问题,并为其他尝试类似事情的人提供一些很好的资源。

科尔多瓦插件开发

一个很好的教程,比官方文档更好地解释了插件的每个部分: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");
    }
}

这是相应的C++代码:

CppLibrary.cpp:

#include "CppLibrary.h"
extern "C" {
    JNIEXPORT int JNICALL Java_org_example_plugin_cpp_Cpp_get7(JNIEnv* env, jobject thiz)
    {
        return 7;
    }
}

CPPP.h:

#pragma once
extern "C" {
    JNIEXPORT int JNICALL Java_org_example_plugin_cpp_Cpp_get7(JNIEnv* env, jobject thiz);
}

C 端实现资源:

http://developer.android.com/ndk/samples/sample_hellojni.html#ci

http://developer.android.com/training/articles/perf-jni.html#faq_ULE

您的C++项目是否公开了任何 RESTful API?由于 Cordova 应用程序完全是客户端应用程序,因此通常使用 REST 连接到后端。

否则,如果您需要在 Cordova 上运行C++,则需要将其构建为 Cordova 插件,您的 c++ 代码将在设备上执行。这是一个更复杂的选择,但Cordova网站提供了编写Cordova插件的指导:http://cordova.apache.org/docs/en/latest/guide/hybrid/plugins/index.html

最新更新