2017-01-24 2 views
1

Ich versuche, eine Anwendung zu schreiben, die RGB- und Punktwolkendaten mit der Google Tango Java API erfasst. Bis jetzt habe ich es geschafft, das Bild von der RGB-Kamera auf einem Bildschirm mit TangoCameraPreview anzuzeigen und es scheint zu funktionieren. Aber sobald ich Gerät auf eine Wand zeigen, und es beginnt eine wirkliche Tiefe zu erfassen sie sofort mit folgenden Ausnahme abstürzt:JNI-Fehler: Versuch, eine Instanz von TangoPointCloudData an onXyzIjAvailable zu übergeben

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) 

Es scheint mich wie eine Art Bibliothek Unverträglichkeit, aber ich bin ziemlich sicher, dass Sowohl Tango Core als auch Tango Java API sind neueste Versionen, die alle gestern aktualisiert wurden. Was vermisse ich?

Hier ist so ziemlich alle Code der Anwendung:

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

Auf den ersten Blick ist es nicht _your_ Bug, und es gibt wenig, was Sie dagegen tun können. Vielleicht, Downgrade der Tango-Version. –

+0

@AlexCohn danke, ich werde es versuchen. Sie meinen, laden Sie das .jar-Paket der vorherigen Version herunter? Es gibt auch eine Option, um das Tablet zurückzusetzen (ich denke). –

+0

Ich weiß nicht, was Ihr Problem lösen wird, aber es riecht wie ein Fehler im Framework. Ich glaube nicht, dass Sie viel tun können, außer auf eine Reparatur zu warten oder nach einer älteren Version ohne diesen Fehler zu suchen. Es könnte hilfreich sein, eine Supportanfrage unter https://developers.google.com/tango/apis/java zu posten. –

Antwort

3

Schauen Sie sich die Antwort here auf den gleichen oder zumindest sehr ähnlichen Problem. Die Lösung war es

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

zum Setup-Code (setupTangoConfig()) hinzuzufügen.

+0

Vielen Dank für die Antwort! Dies scheint die Lösung zu sein. Ich werde überprüfen, sobald ich zu meinem Tango komme und Ihre Antwort akzeptieren, wenn es funktioniert. Die Fehlermeldung könnte jedoch klarer gewesen sein) –

+0

Seltsamerweise findet Google die Antwort nicht, die Sie erwähnten, selbst wenn ich den genauen Text eines Fehlers von diesem Posten suche. –

Verwandte Themen