如何在Tizen中通过消息端口将字符串数组从Web应用程序发送到本机应用程序,反之亦然

时间:2017-04-28 15:22:29

标签: ipc tizen

我有Tizen可穿戴式Web应用程序(javascript)和Tizen本机服务(C / C ++)。 我使用messageport机制在Web应用程序和本机应用程序之间发送数据。 如果我将简单的字符串值从web发送到本机 - 一切正常。但是如果我尝试发送字符串数组值 - 它不是作为字符串数组接收,而是作为带逗号分隔值的字符串接收。

例如: 网络应用程序:

this._remotePoprt().sendMessage(
        [
         {key: "simple_string_key", value: "simple_string"},
         {key: "string_array_key", value: ["string 1", "string 2"]},
        ],
        this._localPort
);

原生申请:

char* simpleString = NULL;
int result = bundle_get_str(rawMessage, "simple_string_key", &simpleString); 
//OK, simpleString = "simple_string"

int arraySize;
const char** stringArray = bundle_get_str_array(rawMessage, "string_array_key", &arraySize);
result = get_last_result();
//ERROR: result = BUNDLE_ERROR_INVALID_PARAMETER

char* complexString = NULL;
result = bundle_get_str(rawMessage, "string_array_key", &complexString);
//OK: complexString = "string 1,string 2"

如果我尝试将字符串数组从本机应用程序发送到Web应用程序,则Web应用程序根本不会接收字符串数组值。

所以问题是 - 是否可以通过Tizen中的消息端口将字符串数组值从Web应用程序发送到本机应用程序,反之亦然。

2 个答案:

答案 0 :(得分:0)

您可以尝试将指针初始化为NULL,将int指定为0,我在Bundle API的示例代码中看到了这一点。

 #include <bundle.h>
 bundle *b = bundle_create();
 char *sa = { "aaa", "bbb", "ccc" };    // A string array of length 3
 bundle_add_str_array(b, "foo", sa, 3); // add a key-val pair

 char **str_array = NULL;
 int len_str_array = 0;

 str_array=bundle_get_str_array(b, "foo", &len_str_array);
 // str_array = { "aaa", "bbb", "ccc" }, and len_str_array = 3

 bundle_free(b);

你甚至可以尝试char * a []而不是char ** a,尽管它们是相同的。

链接:

Bundle API

答案 1 :(得分:0)

原生/网络 - &gt;天然

好的,在本机消息端口中,要从捆绑包接收阵列,您必须使用bundle_iterator_tbundle_foreachbundle_keyval_get_array_val()功能。从message_port_callback调用bundle_iterator_t。

void message_port_cb(int local_port_id, const char *remote_app_id, const char *remote_port,
                      bool trusted_remote_port, bundle *message, 
                      void *user_data){

    bundle_foreach(message, read_data_cb, NULL);

}

int port_id = message_port_register_local_port(local_port, message_port_cb, NULL);

if (port_id < 0)
    dlog_print(DLOG_ERROR, LOG_TAG, "Port register error: %d", port_id);
else
    dlog_print(DLOG_INFO, LOG_TAG, "port_id: %d", port_id);

bundle_keyval_get_array_val()函数用于捕获数组。

void read_data_cb(const char *key, const int type, const bundle_keyval_t *kv, 
                  void *user_data){
    void **array_val = NULL;
    int array_len = 0;
    size_t *array_elem_size = NULL;

    if(bundle_keyval_type_is_array(kv)) {
        bundle_keyval_get_array_val(kv, &array_val, &array_len, &array_elem_size);
        // Do Your code
    }

    else {
        bundle_keyval_get_basic_val(kv, &basic_val, &basic_size);
         // Do Your code
    }

}

您的数据位于array_val。

原生/网络 - &gt;网络

对于与此类似的示例代码:

int ret;

bundle *reply=bundle_create();

char *array[] = {"A","B","C","D"};

bundle_add_str(reply,"test","A");
bundle_add_str_array(reply,"service",array, 4);

ret = message_port_send_message(remote_app_id, remote_port, reply);

if (ret != MESSAGE_PORT_ERROR_NONE)
    dlog_print(DLOG_ERROR, TAG, "message_port_check_remote_port error: %d", ret);
else
    dlog_print(DLOG_INFO, TAG, "Send message done");

bundle_free(reply);

在网络端收到的邮件结构如下:

var data =
[
   {key:"test", value:"A"},
   {key:"service", value:["A","B","C","D"]}
];

要使用收到的数据,回调函数可以类似于:

/* MessagePortCallback instance */
function onReceived(data, remoteMsgPort) {

    for (var i = 0; i < data.length; i++){
        var keyX = data[i].key;
        console.log("key:" + keyX);

        for (var j = 0; j < data[i].value.length; j++){
            var valueX = data[i].value[j];
            console.log("value:" + valueX);        
        }
   }

 }

var localPort = tizen.messageport.requestLocalMessagePort(local_port);
localPort.addMessagePortListener(onReceived);

参考资料:

Message Port: Web Guide

Message Port: Web API Reference

Message Port: Native Guide

Message Port: Native API Reference

Native Bundle API

这就是现在。