2012-02-13 7 views
1

おそらく私はここであまり野心的ですが、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()); 

}

答えて

1

そしてもちろん正しい答えは、最初に私がCPTRを取るのctorしてJava ManagementProcessorオブジェクトを作成する必要がある。

jclass mpclass = jenv->FindClass("NS/ManagementProcessor"); 
jobject jmp = 0; 
jmethodID mpid; 
ManagementProcessorPtr *realm = new ManagementProcessorPtr(e.getRealm()); 
jlong jrealm; 
*(ManagementProcessorPtr **)&jrealm = realm; 
mpid = jenv->GetMethodID(mpclass, "<init>", "(JZ)V"); 
jmp = jenv->NewObject(mpclass, mpid, jrealm, true); 

...

 excep = jenv->NewObject(eclass, jid, 
      jmp, 
      e.getApiErrNum(), 
      message, 
      file, 
      e.getLineNum()); 
1

boost::shared_ptr C++ クラスあります。あなたはそれがManagementProcessorPtr*と同じだと思いますか?

+1

私は、彼らが知っています同じではありません。コンストラクタに何を渡す必要がありますか? SWIGが生成したコードでは、*(VolumePtr **)&jresult = new VolumePtr((const VolumePtr&)result)という形式のものを使用しています。 のすべての場所。 –

関連する問題