繁体   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