2017-02-02 2 views
0

SWIGを使用してJavaのDLLにアクセスしています。文字列の値をchar *に設定する以外は、ほとんどの処理がうまく動作します。その後、JREは終了します。文字列プロパティ(SWIG、Java)の設定時にJREが終了しました

example.h:

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

example.i:

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

のJava:

example.i:

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 * } 

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"を使っても問題ありません。なぜなら "NewCharArray"ではなく "string"で何かを生成するのでしょうか?

私は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; 
} 

それは醜いですが、今で動作します。

関連する問題