[英]How can I make Swig correctly wrap a char* buffer that is modified in C as a Java Something-or-other?
[英]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.