SWIG,我可以为从Java传递到C的char **分配一个值

我有一个C API,看起来像这样:

int my_function(char** assign_me_a_string);

我基本上需要本地代码来告诉我一个价值。 如果我做:

char* my_function();

它工作正常。 我得到一个可以在Java中使用的字符串。 不过,我宁愿使用第一种方法,因为我所有的函数默认返回一个int(状态值)。

我试图使用various.i和这个typemap:

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

这样做我得到一个为Java API生成的String []。 然后我尝试使用它:

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

但这似乎只是崩溃。

那么,有没有一种合适的方法可以从C代码中为Java String赋值? 我不想使用数组,我只需要能够解引用char **并在本地代码中为它分配一个字符串,然后可以将它用作Java中的String对象。


Java String是不可变的,并且引用是按值传递的,所以下面的代码不会做你认为的(纯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 **执行此操作。 然而,必须修改typemap来检查退出时的char *数组(可能是freearg typemap)以替换String []的内容。 你的功能可以只假设一个项目。

或者,您可以将Java String包装在一个类中,该类将通过引用传递; 但是,您又需要使用类型映射来复制已经创建到数据成员中的任何更改。

可能最简单的是提供一个交换状态码和字符串的帮助函数:

// 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  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 *复制到返回的字符串中:

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

不,Java字符串是不可变的,即使通过JNI也不能分配。

链接地址: http://www.djcxy.com/p/20893.html

上一篇: SWIG, can I assign a value to a char** passed from Java to C

下一篇: How does String works as Object in Java