Проблемы интеграции пространственных привязок Azure.Отсутствующие реализации NativeLibrary - PullRequest
0 голосов
/ 28 мая 2019

Я работал с API-интерфейсом пространственных привязок Azure.Я следовал документам и примерам, предоставленным Microsoft, без особых проблем, пока не попытался сделать из него собственный проект.Когда я пытаюсь запустить пользовательский проект с помощью API Spatial Anchors, происходит сбой при поиске некоторых функций, которые должны быть предоставлены библиотеками, указанными в gradle.В журнале ошибок говорится следующее:

2019-05-28 10: 32: 10.642 28982-28982 / com.azurelib.azureanchorsclean E / AndroidRuntime: ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: основной Процесс: com.azurelib.azureanchorsclean,PID: 28982 java.lang.UnsatisfiedLinkError: не найдено для реализации com.microsoft.azure.spatialanchors.status com.microsoft.azure.spatialanchors.NativeLibrary.ssc_cloud_spatial_anchor_session_create (com.microsoft.azure.spatialanchors.Out) (пытался Java_com_microsoft_azure_spatialanchors_NativeLibrary_ssc_1cloud_1spatial_1anchor_1session_1create и Java_com_microsoft_azure_spatialanchors_NativeLibrary_ssc_1cloud_1spatial_1anchor_1session_1create__Lcom_microsoft_azure_spatialanchors_Out_2)at com.microsoft.azure.spatialanchors.NativeLibrary.ssc_cloud_spatial_anchor_session_create (собственный метод) ...

Соответствующие функции ssc_cloud ... могут быть найдены в зависимости от пространственного_анши_java, указанной в сборке gradle: enter image description here

Для облачной сессии я запускаю new деятельности в моей MainActivity onResume():

@Override
protected void onResume(){
    super.onResume();
    Intent intent = new Intent(this, AzureSpatialAnchorsActivity.class);
    intent.putExtra("BasicDemo", true);
    startActivity(intent);
}

И на AzureSpatialAnchorsActivity я создаю ArCore Session и запускаю менеджер привязки:

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

        if (session == null) {
            try {
                ...
                // Create the session.
                session = new Session(/* context= */ this);

            ... //Required catch statements
            } catch (Exception e) {
                message = "Failed to create AR session";
                exception = e;
            }
        }


        try {
            session.resume();
            startNewSession();
        } catch (CameraNotAvailableException e) {
            ...
        }
    }

    private void startNewSession() {
        destroySession();

        cloudAnchorManager = new AzureSpatialAnchorsManager(session);
        cloudAnchorManager.addAnchorLocatedListener(this::onAnchorLocated);
        cloudAnchorManager.addLocateAnchorsCompletedListener(this::onLocateAnchorsCompleted);
        cloudAnchorManager.addSessionUpdatedListener(this::onSessionUpdated);
        cloudAnchorManager.start();
    }

Ошибка происходитпотому что когда я пытаюсь создать CloudSpatialAnchorSession объект

public AzureSpatialAnchorsManager(Session arCoreSession) {
    spatialAnchorsSession = new CloudSpatialAnchorSession();
    ...
}

, конструктор вызывает функцию из NativeLibrary

public CloudSpatialAnchorSession() {
    Out<Long> result_handle = new Out();
    status resultStatus = NativeLibrary.ssc_cloud_spatial_anchor_session_create(result_handle);
    this.handle = (Long)result_handle.value;
    NativeLibraryHelpers.checkStatus(this.handle, resultStatus);
    CookieTracker.add(this);
}

Кажется, проблема в том, что я ранее показывал наскриншот фляги - все, что есть.ssc_cloud_spatial_anchor_session_create вызывается, приложение попадает в тупик:

class NativeLibrary {
    NativeLibrary() {
    }
    ...
    static native status ssc_cloud_spatial_anchor_session_create(Out<Long> var0);
    ...
}

Gradle и другие конфиги копируются / вставляются из исходного образца Microsoft.Я не могу найти то, что мне не хватает, поэтому мой пользовательский проект не может найти реализации NativeLibrary.Для справки вот проект Microsoft , который я использую для создания собственного проекта

Вот мои актуальные файлы Gradle только для справки:

Проект Gradle

buildscript {
    repositories {
        google()
        jcenter()

    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.3.2'
    }
}

allprojects {
    repositories {
        mavenLocal()
        google()
        jcenter()

    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

Модуль Gradle:

apply plugin: 'com.android.application'
def azureSpatialAnchorsSdkVersion = '1.1.0'
android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "com.azurelib.azureanchorsclean"
        minSdkVersion 24
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation 'com.google.ar:core:1.7.0'
    implementation "com.microsoft.azure.spatialanchors:spatialanchors_jni:[${azureSpatialAnchorsSdkVersion}]"
    implementation "com.microsoft.azure.spatialanchors:spatialanchors_java:[${azureSpatialAnchorsSdkVersion}]"
    implementation 'de.javagl:obj:0.2.1'
    implementation 'com.microsoft.aad:adal:1.16.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

Спасибо!

1 Ответ

2 голосов
/ 05 июня 2019

Поскольку вы создаете свой собственный проект, вызываете ли вы метод initialize внутри OnCreate в классе приложения?

 @Override
    public void onCreate() {
        super.onCreate();

        // Use application's context to initialize CloudServices!
        CloudServices.initialize(this);
    }
...