簡體   English   中英

SWIG,我可以為從Java傳遞給C的char **賦值嗎

[英]SWIG, can I assign a value to a char** passed from Java to C

我有一個看起來像這樣的C API:

int my_function(char** assign_me_a_string);

我基本上需要本機代碼來告訴我一個值。 如果我做:

char* my_function();

工作正常。 我得到一個可以在Java中使用的String作為回報。 但是我更喜歡使用第一種方法,因為我的所有函數默認都返回一個int(狀態值)。

我試圖使用variant.i和此類型映射:

%apply char **STRING_ARRAY { char **assign_me_a_string }

這樣做,我得到了為Java API生成的String []。 然后我嘗試通過以下方式使用它:

String[] myStringToAssign = new String[1];
my_function(myStringToAssign);

但這似乎只是崩潰。

因此,是否存在從C代碼內部為Java字符串賦值的正確方法? 我不是在嘗試使用數組,我只需要能夠取消引用char **並在本機代碼中為其分配一個字符串,該字符串隨后可以用作Java中的String對象。

Java字符串是不可變的,引用是通過值傳遞的,因此以下內容將不會發揮您的作用(純Java):

// java: 
void someFunction(String yourString) {yourString = "bye";}
void test() {
    String test = "hi";
    someFunction(test);
    System.out.println(test); // prints "hi", not "bye"!
}

(有關此內容的更多信息,請參見例如Java中的通過引用傳遞字符串? )。 不用說,您也不能使用JNI做到這一點。

請查看SWIG 2.0文檔的24.10.5節:它顯示了如何通過類型映射為char **進行此操作。 但是,那里的類型映射必須進行修改以在退出時檢查char *數組(也許是freearg類型映射)以替換String []的內容。 您的函數只能假設一項。

或者,您可以將Java字符串包裝在一個類中,該類將通過引用傳遞。 但是,您再次必須使用類型映射將所做的所有更改復制到數據成員中。

可能最簡單的方法是提供一個交換狀態代碼和字符串的輔助函數:

// C/C++ lib: the function you'd like to export but can't:
int my_function(char*& ) { 
    val = new char[20];
    ...put stuff in val, don't forget the terminating \0 char...
    return status;
}

創建包裝器:

// SWIG .i file: an "adapter" function, Java gives you no choice: 
%inline %{
char* my_function(int& err) {
    char * val;
    err = my_function(val);
    return val;
%}

SWIG將負責將char *復制到返回的String中:

// From Java you can then do: 
int status;
String result = my_function(status);
System.out.println(result);

不,Java字符串是不可變的,甚至不能通過JNI進行分配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM