[英]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.