2017-02-02 5 views
0

SWIG를 사용하여 Java에서 DLL에 액세스합니다. 문자열 값을 char *로 설정하는 것 외에는 대부분 잘 작동합니다. 그런 다음 JRE가 종료됩니다.문자열 속성 (SWIG, Java)을 설정할 때 JRE가 종료되었습니다.

example.h :

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

본보기 :

%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 

또한 나는 바이트 배열을 사용하려 (추가) :

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

자바 파일의 생성은 잘 작동하지만 빌드가 떨어져 충돌 :

"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"를 사용하면 괜찮을 것입니다. 왜 "문자열"이 아닌 "NewCharArray"가 아닌 무언가를 생성합니까?

저는 VS Express 2015, SWIG 3.0.10, Java 7, 모든 것을 x86으로 사용하고 있습니다.

답변

0

나는 포기하고 몇몇 포장업자를 나의 포장지 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; 
} 

그것은 추한하지만 지금은 작동합니다.