我正在使用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中的所有内容。
答案 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;
}
它丑陋但现在有效。