Я мигрирую из классического Java-приложения для Android через xamarin.Моя проблема связана с использованием служебного соединения через системную службу Android при передаче объекта iBinder через JNI для использования в собственном коде c ++.Более конкретно, я пытаюсь подключиться к устаревшей службе Tango на моем Asus Zenfone AR.При доступе к заданию в c ++ я получаю огромную трассировку стека со следующим исключением:
art/runtime/java_vm_ext.cc:470] JNI DETECTED ERROR IN APPLICATION: IsInstanceOf received NULL jclass
art/runtime/java_vm_ext.cc:470] in call to IsInstanceOf
art/runtime/java_vm_ext.cc:470] from void md50f4250d048afa4418b536451c1ad07e8.TangoServiceConnection.n_onServiceConnected(android.content.ComponentName, android.os.IBinder)
Мой код включает в себя BroadcastReceiver для управления жизненным циклом службы, а также само подключение к службе.
publicclass TangoServiceConnectionReceiver: BroadcastReceiver {public TangoServiceConnection mTangoServiceConnection = new TangoServiceConnection ();
public override void OnReceive(Context context, Intent intent)
{
if (intent.Action.Equals(MainActivity.TANGO_SERVICE_CONNECT))
{
JNITangoWrapper.BindTangoService(context.ApplicationContext, mTangoServiceConnection);
}
if (intent.Action.Equals(MainActivity.TANGO_SERVICE_DISCONNECT))
{
context.ApplicationContext.UnbindService(mTangoServiceConnection);
JNITangoNative.OnTangoServiceDisconnected();
}
}
};
public class TangoServiceConnection : Java.Lang.Object, IServiceConnection
{
public void OnServiceConnected(ComponentName name, IBinder service)
{
JNITangoNative.OnTangoServiceConnected(JNIEnv.Handle, System.IntPtr.Zero, service.Handle);
}
public void OnServiceDisconnected(ComponentName name)
{
}
}
Оболочка JNITangoNative передает дескрипторы через JNI
[DllImport("library", EntryPoint = "Java_com_SOMEPACKAGE_TangoJNINative_onTangoServiceConnected")]
public static extern void OnTangoServiceConnected(IntPtr jniEnv, IntPtr thiz, IntPtr nativeTangoServiceBinder);
JNIEXPORT void JNICALL
Java_com_SOMEPACKAGE_TangoJNINative_onTangoServiceConnected(
JNIEnv *env, jobject /*caller_object*/, jobject iBinder) {
app.OnTangoServiceConnected(env, iBinder);
}
1012 * 102O
Приложение аварийно завершает работу с уже предоставленным исключением, когда TangoService_setBinder (env, iBinder);называется.Я много тестировал себя, и jClass iBinder jObject - это android.os.BinderProxy, такой же, как и в работающем java-приложении для Android.
Я должен еще раз отметить, что в моем приложении работает точно такой же поток приложений.java android prototype.
Я знаю, что это устаревший сервис, но мне он нужен для разработки моего приложения определенным образом.Я был бы рад, если бы кто-нибудь мог предоставить дополнительную информацию или советы и не стеснялся запрашивать более подробную информацию, если это необходимо.
Вот некоторые дополнительные выводы из журнала Visual Studio:
Time Device Name Type PID Tag Message
Asus _A002 Info 12143 TangoIHelper Success! Using default/libtango_client_api.
Asus _A002 Info 6338 TangoCore-UninstallReceiver Tango permissions revoked for Mono.Android.Platform.ApiLevel_24
Asus _A002 Info 6338 TangoCore-UninstallReceiver Uninstall detected.
Asus _A002 Info 6338 TangoCore-UninstallReceiver Tango permissions revoked for com.companyname.Xamarin
Asus _A002 Info 6338 TangoCore-UninstallReceiver Uninstall detected.
Asus _A002 Info 6338 TangoCore-UninstallReceiver Tango permissions revoked for com.companyname.Xamarin
Asus _A002 Info 6338 TangoCore-UninstallReceiver Tango permissions revoked for Mono.Android.DebugRuntime