我在使用JNI的example tango projects之一中找到了这段代码,我不知道上下文是什么以及如何使用它。示例代码有效,但我的代码没有。
void OnXYZijAvailableRouter(void *context, const TangoXYZij *xyz_ij) {
SynchronizationApplication *app =
static_cast<SynchronizationApplication *>(context);
app->OnXYZijAvailable(xyz_ij);
}
我试着在下面模仿它:
void OnFrameAvailableRouter(void *context, const TangoCameraId id,
const TangoImageBuffer *buffer) {
SynchronizationApplication *app =
static_cast<SynchronizationApplication *>(context);
LOGE("Before onframe call.");
app->onFrameAvailable(id, buffer);
LOGE("After onframe call.");
}
但是,当我尝试运行它时,我得到了这个输出:
Before onframe call.
Fatal signal 11 (SIGSEGV) at 0x00000308 (code=1), thread 15673 (Binder_2)
现在我设法找到导致seg错误的指针,但我不知道为什么它不起作用。
当然,我可能做错了什么,但我不知道自从我在示例中制作了完整的代码副本后。
int SynchronizationApplication::TangoConnectCallbacks() {
TangoErrorType depth_ret =
TangoService_connectOnXYZijAvailable(OnXYZijAvailableRouter);
depth_ret = TangoService_connectOnFrameAvailable(TangoCameraId::TANGO_CAMERA_COLOR, NULL,
OnFrameAvailableRouter);
return depth_ret;
}
我从路由器调用的功能。
void OnXYZijAvailable(const TangoXYZij *xyz_ij);
void onFrameAvailable(const TangoCameraId id, const TangoImageBuffer *buffer);
背景究竟是什么?我已经阅读了一些解释,但我仍然不明白为什么我可以使用上面示例中的上下文调用该函数,也不知道为什么我需要路由器函数。我已经在概念上阅读了this SO answer和the android page,但我发现上下文和我的班级之间没有任何联系。
答案 0 :(得分:1)
在OnXYZijAvailableRouter
(深度回调)中,上下文是从TangoService_connect
函数传入的实例。我相信在应用程序类中,应该有这样一行:TangoService_connect(this, tango_config_);
因此this
成为调用回调时的上下文。此上下文也适用于姿势和事件回调。
对于OnFrameAvailableRouter
,上下文是您在TangoService_connectOnFrameAvailable
中传入的实例。在这种情况下,代码将NULL设置为上下文,但在回调中,它在NULL上尝试调用函数。那是崩溃点。
我相信如果您将其更改为TangoService_connectOnFrameAvailable(TangoCameraId::TANGO_CAMERA_COLOR, this, OnFrameAvailableRouter);
,它应该可以正常工作。
路由器函数用于回调,我还没有找到一种向API提供实例的函数指针的方法。但是,如果你找到了解决方法,请告诉我,我也想知道..