Доступ к коду C ++ в Apache Cordova для Android

Я разрабатываю приложение для Windows 10 и Android с использованием Apache Cordova в Visual Studio 2015. Внутренняя логика будет содержаться в проекте c ++, который, как мы надеемся, будет скомпилирован в .so или .dll в зависимости от платформы.

Я провел некоторые исследования плагинов Cordova для Android, но хороших учебников не было. Что конкретно мне нужно сделать (на стороне c ++ и javascript), чтобы соединить две базы кода?

4

Решение

После нескольких исследований и множества тупиков я смог заставить свой код C ++ работать на Cordova. Я отвечаю здесь, чтобы задокументировать некоторые из моих проблем и дать хорошие ресурсы для других, пытающихся сделать то же самое.

Cordova плагин разработка

Хороший учебник, который объясняет каждую часть плагина лучше, чем официальная документация: https://blogs.oracle.com/mobile/entry/introduction_to_custom_cordova_plugin

Моя самая большая проблема с этой частью разработки состояла в том, что удаление плагина Cordova в VS 2015 делает дерьмовую работу и иногда ищет файлы в неправильных местах. Будьте осторожны, если вам нужно изменить 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_battelle_plugin_backend_Backend_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

5

Другие решения

Предоставляет ли ваш проект C ++ какие-либо RESTful API-интерфейсы? Поскольку приложение Cordova полностью является клиентским приложением, обычно для подключения к серверной части используется REST.

В противном случае, если вам нужно запустить C ++ на Cordova, вам нужно собрать его как плагин Cordova, где ваш код c ++ будет выполняться на устройстве. Это гораздо более сложная альтернатива, но на сайте Cordova есть руководство по написанию плагина Cordova: http://cordova.apache.org/docs/en/latest/guide/hybrid/plugins/index.html

0

По вопросам рекламы [email protected]