おそらく私はここであまり野心的ですが、shared_ptrをJavaの例外に戻すようにしています。問題をboost :: shared_ptr <>をNewObject()に渡す
私はjavaでExceptionを捕まえることができますが、ManagementProcessorオブジェクト自体のメソッドにアクセスしようとすると、SIGSEGVを取得します。新しいManagementProcessorPtr()を使用して空の1つを送信すると、正しい動作が得られます(別の例外がスローされます)。
洞察?
ありがとうございます!
オンチップ・
typedef boost::shared_ptr<ManagementProcessor> ManagementProcessorPtr;
%include "boost_shared_ptr.i"
%shared_ptr(ManagementProcessor);
%typemap(javabase) Exception "java.lang.RuntimeException";
%typemap(javabase) AuthenticationExceptionManagementProcessor "NS/Exception";
%exception {
try {
$action
}
catch (AuthenticationException<ManagementProcessor> & e) {
jclass eclass = jenv->FindClass("NS/AuthenticationExceptionManagementProcessor");
if (eclass) {
jobject excep = 0;
jmethodID jid;
jstring message = jenv->NewStringUTF(e.getMessage().c_str());
jstring file = jenv->NewStringUTF(e.getFileName().c_str());
ManagementProcessorPtr* realm = new ManagementProcessorPtr(e.getRealm());
jlong jrealm;
*(ManagementProcessorPtr **)&jrealm = realm;
jid = jenv->GetMethodID(eclass, "<init>",
"("
"LNS/ManagementProcessor;"
"J"
"Ljava/lang/String;"
"Ljava/lang/String;"
"J)V");
if (jid) {
excep = jenv->NewObject(eclass, jid,
jrealm,
e.getApiErrNum(),
message,
file,
e.getLineNum());
if (excep) {
jenv->Throw((__jthrowable*) excep);
}
}
}
クライアントコード:
} catch (AuthenticationExceptionManagementProcessor e) {
java.lang.System.err.println(e);
ManagementProcessor mp = e.getRealm();
java.lang.System.err.println("got mp");
java.lang.System.out.println(mp.getUUID());
}
私は、彼らが知っています同じではありません。コンストラクタに何を渡す必要がありますか? SWIGが生成したコードでは、*(VolumePtr **)&jresult = new VolumePtr((const VolumePtr&)result)という形式のものを使用しています。 のすべての場所。 –