无法传递 boost::shared_ptr<>进入 NewObject()
也许我在这里太过雄心勃勃,但我试图通过像这样的异常将shared_ptr传回Java。
我能够捕获 java 中的异常,但是当我尝试访问 ManagementProcessor 对象本身中的任何方法时,我得到一个 SIGSEGV。如果我使用 new ManagementProcessorPtr() 发送一个空的,我会得到正确的行为(我抛出一个不同的异常)。
有什么见解吗?
谢谢!
-芯片
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());
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
boost::shared_ptr
是一个 C++ 类。是什么让您认为它与ManagementProcessorPtr*
相同?a
boost::shared_ptr
is a c++ class. what makes you think that it is the same as aManagementProcessorPtr*
?当然,正确的答案是,首先我必须使用采用 CPtr 的 ctor 创建 Java ManagementProcessor 对象:
...
And of course the right answer is that first I have to create the Java ManagementProcessor object with the ctor that takes a CPtr:
...