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

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

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

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

最佳答案

经过更多研究和许多死胡同后,我能够让我的 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++代码:

Cpp 库.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

关于android - 在 Apache Cordova for Android 中访问 C++ 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35442243/

相关文章:

android - 在 test.Jar 中启动 startActivity() ,Cordova 插件

android - 没有操作栏的android compat的黑暗 Activity ?

android - PhoneGap - OnDeviceReady 方法未被调用

javascript - 使用 Phonegap、AJAX、PHP 和 mySQL 登录无法正常工作

c++ - STL 中 next_permutation 的 Python 实现

c++ - 为什么 CMake 使用 Opencv 未正确设置包含目录(MSVC 2010 项目)

c++ - 定义类 X 的析构函数,它继承自指向对象 Y 的指针 vector 并具有指向 Z 的指针数组

android - 如何跨多个项目共享单个库源

Android 如何在 EditText 或 AutoCompleteTextView 的内容区域内放置 ICON(即搜索图标)

android - 尝试调用虚拟方法'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData