2017-02-02 59 views
0

我正在使用SWIG訪問Java中的DLL。除了將字符串值設置爲char *之外,大多數情況都可以正常工作。然後JRE將被終止。JRE在設置字符串屬性(SWIG,Java)時終止

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

回答

0

我放棄了,並添加了一些setter到我的包裝DLL。

這些制定者做了「串魔術」:

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

這是醜陋的,但工程現在。