Проблема при передаче boost :: shared_ptr <> в NewObject () - PullRequest
1 голос
/ 14 февраля 2012

Возможно, я здесь слишком амбициозен, но я пытаюсь передать shared_ptr обратно в Java через исключение вроде этого.

Я могу поймать Исключение в Java, но когда я пытаюсь получить доступ к любым методам в самом объекте ManagementProcessor, я получаю SIGSEGV. Если я использую новый ManagementProcessorPtr () для отправки пустого, я получаю правильное поведение (я выкидываю другое исключение).

Есть идеи?

Спасибо!

-Chip

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());

}

Ответы [ 2 ]

1 голос
/ 14 февраля 2012

И, конечно, правильный ответ - сначала я должен создать объект Java ManagementProcessor с ctor, который принимает CPtr:

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 голос
/ 14 февраля 2012

a boost::shared_ptr - это класс c ++ . что заставляет вас думать, что это то же самое, что и ManagementProcessorPtr*?

...