微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

访问Apache Cordova for Android中的C代码

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

我已经为Android的Cordova插件做了一些研究,但是没有任何好的教程.我需要做什么(在c和javascript方面)连接两个代码库?

解决方法:

经过一些研究和大量的死胡同,我能够在Cordova上运行我的C代码.我在这里回复记录我的一些问题,并为尝试类似事情的其他人提供一些好的资源.

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_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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐