【问题标题】:Accessing C++ code in Apache Cordova for Android在 Apache Cordova for Android 中访问 C++ 代码
【发布时间】:2016-02-16 20:21:11
【问题描述】:

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

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

【问题讨论】:

    标签: android c++ cordova cordova-plugins visual-studio-cordova


    【解决方案1】:

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

    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");
        }
    }
    

    这里是对应的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端实现资源:

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

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

    【讨论】:

    • 你是传奇兄弟,这太棒了
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-19
      • 2015-05-10
      • 1970-01-01
      • 2016-05-13
      • 1970-01-01
      相关资源
      最近更新 更多