Служба подключения к SystemService в Xamarin.Android (JNI - C ++ - iBinder) - PullRequest
0 голосов
/ 22 мая 2018

Я мигрирую из классического 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
...