【问题标题】:Azure spatial anchors integration issues. Missing NativeLibrary implementationsAzure 空间锚点集成问题。缺少 NativeLibrary 实现
【发布时间】:2019-05-28 02:38:31
【问题描述】:

我一直在修改 Azure 的空间锚点 API。在我尝试从中创建自己的项目之前,我遵循了 Microsoft 提供的文档和示例,没有遇到很多问题。当我尝试使用 Spatial anchors API 运行自定义项目时,它会在寻找一些应该由 gradle 中指定的库提供的函数时崩溃。错误日志是这样写的:

2019-05-28 10:32:10.642 28982-28982/com.azurelib.azureanchorsclean E/AndroidRuntime: 致命异常: main 进程: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) 在 com.microsoft.azure.spatialanchors.NativeLibrary.ssc_cloud_spatial_anchor_session_create(本机方法) ...

相关的ssc_cloud...函数可以在gradle build中指定的spatialanchors_java依赖中找到:

对于云会话,我在 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);
}

问题似乎是我之前在 jar 屏幕截图上显示的就是所有内容。 ssc_cloud_spatial_anchor_session_create 被调用,应用程序陷入死胡同:

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

gradle 和其他配置是从原始 Microsoft 示例中复制/粘贴的。我找不到导致我的自定义项目找不到NativeLibrary 的实现的缺失内容。作为参考,here's the Microsoft project 我用来建立我自己的项目的

这是我的 实际 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
}

模块分级:

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'
}

谢谢!

【问题讨论】:

  • 你项目的 gradle 文件是什么样的?只需确保您没有错过示例项目中的任何依赖项。
  • @MorrisonChang 添加了 gradle 文件!
  • @Axel 这解决了您的问题吗?我在尝试为此创建 Xamarin 绑定时遇到了完全相同的问题,但不确定您为您解决了哪些问题:github.com/dotMorten/Xamarin.AzureSpatialAnchors
  • 您使用的设备是否支持ARCore?
  • @AlbertoVega-MSFT 是的,需要 ARCore 的原始 Microsoft 示例可以在设备上正常工作

标签: android azure azure-spatial-anchors


【解决方案1】:

由于您正在创建自己的项目,您是否在应用程序类的 OnCreate 中调用了初始化方法?

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

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

【讨论】:

  • 哇,好用。我没想到这会有一个代码内解决方案。我确定我遇到了配置问题!
猜你喜欢
  • 2021-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 2020-06-27
相关资源
最近更新 更多