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;
}
它很丑,但现在可以用了。
我正在使用 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;
}
它很丑,但现在可以用了。