访问C++;Apache Cordova for Android中的代码

访问C++;Apache Cordova for Android中的代码,android,c++,cordova,cordova-plugins,visual-studio-cordova,Android,C++,Cordova,Cordova Plugins,Visual Studio Cordova,我正在Visual Studio 2015中使用Apache Cordova开发一款针对Windows 10和Android的应用程序。后端逻辑将包含在C++项目中,希望根据平台将其编译为.SO或.DLL。p> 我对android的Cordova插件做了一些研究,但还没有好的教程。我需要做什么(在C++和JavaScript方面)连接两个代码库?< /p> < p>你的C++项目是否暴露了任何REST API?因为Cordova应用程序完全是客户端应用程序,所以使用REST连接到后端是很常见的

我正在Visual Studio 2015中使用Apache Cordova开发一款针对Windows 10和Android的应用程序。后端逻辑将包含在C++项目中,希望根据平台将其编译为.SO或.DLL。p>
我对android的Cordova插件做了一些研究,但还没有好的教程。我需要做什么(在C++和JavaScript方面)连接两个代码库?< /p> < p>你的C++项目是否暴露了任何REST API?因为Cordova应用程序完全是客户端应用程序,所以使用REST连接到后端是很常见的


否则,如果需要在科尔多瓦上运行C++,则需要将其构建为科尔多瓦插件,其中C++代码将在设备上执行。这是一个更为复杂的选择,但科尔多瓦网站有一个指导编写一个科尔多瓦插件:

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

Cordova插件开发

一个比官方文档更好地解释插件每个部分的好教程:

我在这部分开发中遇到的最大问题是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;
    }

}
Cpp.h:

#pragma once

extern "C" {
    JNIEXPORT int JNICALL Java_org_example_plugin_cpp_Cpp_get7(JNIEnv* env, jobject thiz);
}
C端实施资源:


兄弟,你是一位传奇人物,这太神奇了