我尝试进行FFI调用,但是在ffi_call(在这种情况下为gtk_init
)调用的函数内部出现了分段错误。我不确定我搞砸了。
/*
* gtk_init.cc
*/
#include <ffi.h>
#include <gtk/gtk.h>
void test();
int main(int argc, char *argv[]) {
test();
return 0;
}
void test() {
ffi_cif cif;
ffi_type *arg_types[2];
void *arg_values[2];
ffi_status status;
ffi_arg result;
arg_types[0] = &ffi_type_uint;
arg_types[1] = &ffi_type_pointer;
status = ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_void, arg_types);
if (status != FFI_OK) {
printf("Failed to prep_ffi\n");
return;
}
int argc = 4;
char **argv = (char**)malloc(sizeof(char*) * argc);
argv[0] = strcpy((char*)malloc(sizeof(char) * 6), "test");
argv[1] = strcpy((char*)malloc(sizeof(char) * 13), "--gtk-debug");
argv[2] = strcpy((char*)malloc(sizeof(char) * 6), "misc");
argv[3] = strcpy((char*)malloc(sizeof(char) * 6), "last");
arg_values[0] = &argc;
arg_values[1] = &argv;
ffi_call(&cif, FFI_FN(gtk_init), &result, arg_values);
// gtk_init(&argc, &argv);
for (int i = 0; i < argc; i++) {
printf("%s\n", argv[i]);
free(argv[i]);
}
free(argv);
}
完整的要点可以是found here。
答案 0 :(得分:2)
问题在于ffi_call()
将参数的地址作为gtk_init()
取sendDataToExecutionAPICallback: function() {
post({
'url': 'https://script.google.com/macros/s/#####/exec', // URL of Web Apps
'callback': obj.executionAPIResponse,
'request': {
'parameters': {
'data1': 'ok1 from script',
'data2': 'ok2 from script'
},
'password': 'samplePassword',
}
});
},
executionAPIResponse: function(response) {
var info;
if (response == 'ok') {
info = 'Data has been entered';
} else {
info = 'Error...';
}
obj.displayMessage(info);
},
function post(options) {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
// JSON response assumed. Other APIs may have different responses.
options.callback(xhr.responseText);
} else if(xhr.readyState === 4 && xhr.status !== 200) {
console.log('post', xhr.readyState, xhr.status, xhr.responseText);
}
};
xhr.open('POST', options.url, true);
// Set standard Google APIs authentication header.
xhr.send(JSON.stringify(options.request));
}
和int *
,您需要获取这些地址,以便{{1}和} char ***
,有趣吗?
正如评论int **
中所述,也期望char ****
被gtk_init()
终止。
最后一个问题是argv
是错误的类型,在这种情况下您必须使用NULL
(并且ffi_type_uint
需要ffi_type_pointer
)。
所以最终的固定代码是:
int
免责声明:未经测试。