设置字符串属性时,JRE终止(SWIG,Java)

时间:2017-02-02 14:42:39

标签: java visual-studio swig

我正在使用SWIG访问Java中的DLL。除了将字符串值设置为char *之外,大多数工作正常。然后JRE将被终止。

example.h:

typedef struct {
  char* name;
  int number;
} MyStruct;

example.i:

%module example
%{
   #include "example.h"
%}
%include "example.h"

爪哇:

int number = MyStruct.getNumber() # works
MyStruct.setNumber(123)           # works

String name = MyStruct.getName(); # works
MyStruct.setName("newName");      # crash

我还尝试使用Byte Arrays:

example.i(已添加):

%include "various.i"
%apply char *BYTE { char * }

Java文件的生成工作正常,但构建崩溃了:

"jstring cannot convert to jbyteArray"

包装代码说:

 SWIGEXPORT jbyteArray JNICALL Java_bla_VERSION_1DLL_1get(JNIEnv *jenv, jclass jcls) {
 ...
 if (result) jresult = jenv->NewStringUTF((const char *)result);
 return jresult;
 }

这有点像虫子吗?使用“various.i”应该没问题,为什么它会产生“string”而不是“NewCharArray”呢?

我正在使用VS Express 2015,SWIG 3.0.10,Java 7,x86中的所有内容。

1 个答案:

答案 0 :(得分:0)

我放弃了,并为我的包装dll添加了一些setter。

这些制定者执行"字符串魔术":

void SetMyStructName(Object* obj, char* newString)
{
    char *b = new char[strlen(newString) + 1]{};
    std::copy(newString, newString + strlen(newString), b);
    obj->mystruct.name = b;
}

它丑陋但现在有效。