我正在使用NIF进行C-Erlang集成,在初始化Binary
和添加指向其数据的char*
时遇到了一些问题。
我是这样做的:
ErlNifBinary *output_binary;
enif_alloc_binary(500, output_binary);
strcpy(output_binary->data, "Here is a string");
return enif_make_binary(env, output_binary);
你知道我做得不对吗?我有一个分割错误。
UPDATE:我消除了分段错误。但是现在我不能返回包含String
的Erlang二进制文件。
用enif_make_string
和binary.data
在Erlang上得到一个String
。但当我尝试将enif_make_binary
与二进制文件一起使用时,我得到了类似<<0,0,0,0,0,0,0,0,112,40,129,20>>
的东西,我需要做什么来转换?
为output_binary
对象分配内存,但output_binary->data
指向一个无效对象。您可以通过以下方式为output_binary->data
分配内存:
output_binary->data = malloc(sizeof "Here is a string"); // or enif_alloc
strcpy(output_binary->data, "Here is a string");
刚刚发现问题。
我应该返回一个二进制的地址,而不是二进制的,所以只要一个return enif_make_binary(env, &output_binary);
就可以了。
对于任何正在寻找它的人来说,它在C或C++中实际上很容易。
您需要分配ErlNifBinary
对象(而不是字符串)。通过调用enif_make_binary
创建ERL_NIF_TERM
后,ErlNifBinary
将变为只读,所有权将转移到ERL_NIF_TERM
。您可以有效地忘记ErlNifBinary
对象。
ErlNifBinary bin;
std::string str = "hi there";
enif_alloc_binary(str.size(), &bin);
strcpy((char*)bin.data, str.c_str());
bin.size = str.size();
ERL_NIF_TERM term = enif_make_binary(env,&bin);
如果您使用纯C语言,那么静态字符串也同样有效。
ErlNifBinary bin;
const char * str = "hi there";
enif_alloc_binary(strlen(str), &bin);
strcpy((char*)bin.data, str);
bin.size = strlen(str);
ERL_NIF_TERM term = enif_make_binary(env,&bin);