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) {
}
});
}
}
Auf den ersten Blick ist es nicht _your_ Bug, und es gibt wenig, was Sie dagegen tun können. Vielleicht, Downgrade der Tango-Version. –
@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). –
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. –