2017-05-22 56 views
2

我有一個拷貝一個字符串到一個已經傳遞給它的緩衝區中的C函數:如何使統一FFI工作菲羅

void get_machine(char *buf) { 
    /* do something to acquire the machine string */ 
    strcpy(buf, machine_string); 
} 

我想從菲羅稱之爲:

machine := String new: 256. 
self ffiCall: #(void get_machine(String machine)) module: 'ffilibc.so'. 

但這不起作用:machine_string的內容不會被複制到機器中。什麼是正確的方法來做到這一點?

回答

2

「不行」太含糊。你能告訴我你的錯誤是什麼?

如果是「找不到模塊」,這是因爲您需要提供完整路徑(除非庫與圖像位於同一位置)。還要記住庫需要編譯爲32位。

+0

對不起,我的意思是machine_string的內容無法複製到緩衝區中。我得到的只有256個空間。 –

+0

只是爲了安全起見:您確定C函數能做到您認爲的那樣嗎?你確定它沒有收到一個空字符串? –

+0

是的,我確定。我編寫了一個簡單的C程序來測試C庫。 –

3

我知道String緩衝區是不可變的。這就是C函數無法寫入的原因。

解決方案是使用ByteArray。

+0

,然後在其上使用#asString。 (或者如果出現的話#asWideString) – philippeback