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

JRE terminated when setting a string property (SWIG, Java)

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

example.h:

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

example.i:

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

Java:

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

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

我也尝试使用字节数组:

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 中的所有内容。

我放弃并在我的包装器 dll 中添加了一些 setter。

这些设置器执行 "string magic":

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

它很丑,但现在可以用了。