2017-01-24 20 views
1

Я пытаюсь написать приложение, которое собирает данные RGB и облака точек с помощью API Java Tango Java. Пока мне удалось показать изображение с камеры RGB на экране с помощью TangoCameraPreview и, похоже, он работает. Но как только я указываю устройство по направлению к стене, и она начинает захватывать некоторую реальную глубину сразу сбой за исключением следующего:Ошибка JNI: попытка передать экземпляр TangoPointCloudData на onXyzIjAvailable

I/tango_client_api: TangoErrorType TangoService_connectOnTangoEvent(void (*)(void*, const TangoEvent*), ...): Connecting callbacks... 
I/tango_client_api: TangoErrorType TangoService_connectOnTangoEvent(void (*)(void*, const TangoEvent*), ...): Done connecting callbacks. 
E/art: JNI ERROR (app bug): attempt to pass an instance of com.google.atap.tangoservice.TangoPointCloudData as argument 1 to void com.threedvideo.threedvideograbber.MainActivity$2.onXyzIjAvailable(com.google.atap.tangoservice.TangoXyzIjData) 
A/art: art/runtime/check_jni.cc:64] JNI DETECTED ERROR IN APPLICATION: bad arguments passed to void com.threedvideo.threedvideograbber.MainActivity$2.onXyzIjAvailable(com.google.atap.tangoservice.TangoXyzIjData) (see above for details) 
A/art: art/runtime/check_jni.cc:64] "Binder_3" prio=5 tid=17 Runnable 
A/art: art/runtime/check_jni.cc:64] | group="main" sCount=0 dsCount=0 obj=0x64946ba0 self=0x4ab112f8 
A/art: art/runtime/check_jni.cc:64] | sysTid=10535 nice=0 cgrp=apps sched=0/0 handle=0x4ab11028 
A/art: art/runtime/check_jni.cc:64] | state=R schedstat=(67362009 19616160 284) utm=3 stm=3 core=1 HZ=100 
A/art: art/runtime/check_jni.cc:64] | stack=0x4ab81000-0x4ab85000 stackSize=1016KB 
A/art: art/runtime/check_jni.cc:64] (no managed stack frames) 
A/art: art/runtime/check_jni.cc:64] 
A/art: art/runtime/runtime.cc:203] Runtime aborting... 
A/art: art/runtime/runtime.cc:203] Aborting thread: 
A/art: art/runtime/runtime.cc:203] "Binder_3" prio=5 tid=17 Runnable 
    | group="main" sCount=0 dsCount=0 obj=0x64946ba0 self=0x4ab112f8 
    | sysTid=10535 nice=0 cgrp=apps sched=0/0 handle=0x4ab11028 
    | state=R schedstat=(67965509 19729327 285) utm=3 stm=3 core=1 HZ=100 
    | stack=0x4ab81000-0x4ab85000 stackSize=1016KB 
    native: art::Thread::DumpStack(std::ostream&) const+87 [0x41714b78] (libart.so) 
    native: ??? [0x4170cc62] (libart.so) 
    native: art::Runtime::Abort()+79 [0x4170d204] (libart.so) 
    native: art::LogMessage::~LogMessage()+507 [0x415b889c] (libart.so) 
    native: ??? [0x415c0ad4] (libart.so) 
    native: art::JniAbortF(char const*, char const*, ...)+51 [0x415c1254] (libart.so) 
    native: ??? [0x41667ee2] (libart.so) 
    native: ??? [0x41668444] (libart.so) 
    native: ??? [0x416c6e56] (libart.so) 
    native: ??? [0x415ca020] (libart.so) 
    native: _JNIEnv::CallVoidMethod(_jobject*, _jmethodID*, ...)+19 [0x489d97c8] (libtango_client_api.so) 
    native: onXYZijParcelAvailable+217 [0x489d98d6] (libtango_client_api.so) 
    native: TangoListener::onXYZijParcelAvailable(android::Parcel const&)+47 [0x489cf8f8] (libtango_client_api.so) 
    native: Tango::ClientListener::onTransact(unsigned int, android::Parcel const&, android::Parcel*, unsigned int)+261 [0x489dd0ee] (libtango_client_api.so) 
    native: android::BBinder::transact(unsigned int, android::Parcel const&, android::Parcel*, unsigned int)+57 [0x401dc222] (libbinder.so) 
    native: android::IPCThreadState::executeCommand(int)+505 [0x401e0796] (libbinder.so) 
    native: android::IPCThreadState::getAndExecuteCommand()+37 [0x401e0b16] (libbinder.so) 
    native: android::IPCThreadState::joinThreadPool(bool)+47 [0x401e0b8c] (libbinder.so) 
    native: ??? [0x401e49a8] (libbinder.so) 
    native: android::Thread::_threadLoop(void*)+213 [0x401afa56] (libutils.so) 
    native: android::AndroidRuntime::javaThreadShell(void*)+65 [0x4023ceae] (libandroid_runtime.so) 
    native: ??? [0x401af588] (libutils.so) 
    native: __thread_entry+72 [0x401341b0] (libc.so) 
    native: pthread_create+240 [0x40134348] (libc.so) 
    (no managed stack frames) 

Мне кажется, как какой-то библиотеки несовместимости, но я уверен, что как Tango Core, так и Tango Java API - это последние версии, обновленные вчера. Что мне не хватает?

Здесь довольно много всего кода приложения:

package com.threedvideo.threedvideograbber; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 

import com.google.atap.tangoservice.Tango; 
import com.google.atap.tangoservice.TangoCameraIntrinsics; 
import com.google.atap.tangoservice.TangoCameraPreview; 
import com.google.atap.tangoservice.TangoConfig; 
import com.google.atap.tangoservice.TangoCoordinateFramePair; 
import com.google.atap.tangoservice.TangoErrorException; 
import com.google.atap.tangoservice.TangoEvent; 
import com.google.atap.tangoservice.TangoInvalidException; 
import com.google.atap.tangoservice.TangoOutOfDateException; 
import com.google.atap.tangoservice.TangoPointCloudData; 
import com.google.atap.tangoservice.TangoPoseData; 
import com.google.atap.tangoservice.TangoXyzIjData; 

import java.util.ArrayList; 


public class MainActivity extends AppCompatActivity { 

    private static final String TAG = "MainActivity"; 

    private Tango tango; 
    private TangoConfig tangoConfig; 
    private TangoCameraPreview tangoCameraPreview; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 

     tango = new Tango(MainActivity.this, new Runnable() { 
      @Override 
      public void run() { 
       synchronized (MainActivity.this) { 
        try { 
         tangoConfig = setupTangoConfig(tango); 
         tango.connect(tangoConfig); 

         tangoCameraPreview = (TangoCameraPreview) findViewById(R.id.tango_camera_preview); 
         tangoCameraPreview.connectToTangoCamera(tango, TangoCameraIntrinsics.TANGO_CAMERA_COLOR); 

         startupTango(); 
        } catch (TangoOutOfDateException e) { 
         Log.e(TAG, "Tango service out of date", e); 
        } catch (TangoErrorException e) { 
         Log.e(TAG, "Tango service error", e); 
        } catch (TangoInvalidException e) { 
         Log.e(TAG, "Tango invalid exception", e); 
        } 
       } 
      } 
     }); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 

     synchronized (MainActivity.this) { 
      tangoCameraPreview.disconnectFromTangoCamera(); 
      tango.disconnect(); 
     } 
    } 

    private TangoConfig setupTangoConfig(Tango t) { 
     TangoConfig config = t.getConfig(TangoConfig.CONFIG_TYPE_DEFAULT); 

     config.putBoolean(TangoConfig.KEY_BOOLEAN_DEPTH, true); 
     config.putBoolean(TangoConfig.KEY_BOOLEAN_COLORCAMERA, true); 
     config.putBoolean(TangoConfig.KEY_BOOLEAN_MOTIONTRACKING, true); 
     config.putBoolean(TangoConfig.KEY_BOOLEAN_AUTORECOVERY, true); 
     config.putBoolean(TangoConfig.KEY_BOOLEAN_HIGH_RATE_POSE, true); 
     config.putBoolean(TangoConfig.KEY_BOOLEAN_SMOOTH_POSE, true); 

     return config; 
    } 

    private void startupTango() { 
     final ArrayList<TangoCoordinateFramePair> framePairs = new ArrayList<>(); 
     framePairs.add(new TangoCoordinateFramePair(TangoPoseData.COORDINATE_FRAME_START_OF_SERVICE, TangoPoseData.COORDINATE_FRAME_DEVICE)); 
     tango.connectListener(framePairs, new Tango.OnTangoUpdateListener() { 
      @Override 
      public void onPoseAvailable(TangoPoseData tangoPoseData) { 
      } 

      @Override 
      public void onXyzIjAvailable(TangoXyzIjData tangoXyzIjData) { 
      } 

      @Override 
      public void onFrameAvailable(int cameraId) { 
       if (cameraId == TangoCameraIntrinsics.TANGO_CAMERA_COLOR) 
        tangoCameraPreview.onFrameAvailable(); 
      } 

      @Override 
      public void onTangoEvent(TangoEvent tangoEvent) { 
      } 

      @Override 
      public void onPointCloudAvailable(TangoPointCloudData tangoPointCloudData) { 
      } 
     }); 
    } 
} 
+1

На первый взгляд это не ошибка _your_, и вы мало что можете с этим поделать. Возможно, понизите версию Tango. –

+0

@AlexCohn спасибо, я постараюсь. Вы имеете в виду загрузить пакет .jar предыдущей версии? Также есть возможность сбросить заводские настройки планшета (я думаю). –

+0

Я не знаю, что решит вашу проблему, но это пахнет как ошибка в рамках. Я не думаю, что вы можете многое сделать, кроме как ждать исправления или искать более старую версию без этой ошибки. Было бы полезно отправить запрос поддержки на https://developers.google.com/tango/apis/java –

ответ

3

Заканчивать ответ here к тому же или, по крайней мере, очень похожий вопрос. Решение было добавить

config.putInt(TangoConfig.KEY_INT_DEPTH_MODE, TangoConfig.TANGO_DEPTH_MODE_POINT_CLOUD); 

к коду установки (setupTangoConfig()).

+0

Спасибо за ответ! Это похоже на решение. Я проверю, как только я доберусь до своего танго и приму свой ответ, если он сработает. Сообщение об ошибке могло быть более ясным, хотя) –

+0

Как ни странно, Google не находит ответ, о котором вы говорили, даже если я искал точный текст ошибки с этого поста. –