我有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应用程序发送到本机应用程序,反之亦然。
答案 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,尽管它们是相同的。
链接:
答案 1 :(得分:0)
原生/网络 - &gt;天然强>
好的,在本机消息端口中,要从捆绑包接收阵列,您必须使用bundle_iterator_t,bundle_foreach,bundle_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 API Reference
Message Port: Native API Reference
这就是现在。