es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Error de UnsatisfiedLinkError en la aplicación de Android para la Cámara de Profundidad de la Estructura Core: no se puede localizar el símbolo “__sfp_handle_exceptions”.

Estoy tratando de crear una aplicación de Android para la cámara de profundidad Structure Core. Este producto viene con una API de Android, pero el problema es que la documentación de la API es muy corta y no muy útil. Tiene una aplicación de Android preconstruida en forma de un archivo APK y códigos de proyecto de ejemplo para Windows, Linux y Android. El problema es que el proyecto de ejemplo de Android es muy antiguo. Logré construirlo e instalarlo en un dispositivo, pero la aplicación no se inicia con el error java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "__sfp_handle_exceptions".

Por lo tanto, intenté hacer una aplicación muy simple desde cero, pero al final sigue apareciendo el mismo error (la aplicación se construye e instala satisfactoriamente):

2021-11-30 10:48:02.844 25827-25827/com.bridgewiz.structurecore.coreandroidtrial E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.bridgewiz.structurecore.coreandroidtrial, PID: 25827
java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "__sfp_handle_exceptions" referenced by "/data/app/com.bridgewiz.structurecore.coreandroidtrial-sHH5hFqRXfZv5IT1fQYgmg==/base.apk!/lib/arm64-v8a/libStructure.so"…

La API incluye el archivo de biblioteca principal .so llamado libStructure.so y bibliotecas de utilidad para diferentes proyectos de ejemplo (libDepthTester.so,libPlayground.so, etc.).

Mi pregunta es si el error dado anteriormente resulta de problemas en mi implementación o hay algo que falta en la compilación de los archivos de biblioteca .so suministrados por el productor.

La información de entrada de los archivos .so (obtenida por aarch64-linux-android-readelf.exe) es la siguiente:

Imagen

En mi propio proyecto, el archivo gradle de nivel de aplicación es el siguiente:

plugins {
id ‘com.android.application’
id ‘kotlin-android’
}

android {
compileSdk 31

defaultConfig {
applicationId "com.bridgewiz.structurecore.coreandroidtrial"
minSdk 27
targetSdk 31
versionCode 1
versionName "1.0"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
externalNativeBuild {
    cmake {
        arguments '-DANDROID_STL=c++_shared'
        targets 'coreandroidtrial'
        abiFilters 'arm64-v8a'
    }
}

}

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
externalNativeBuild {
cmake {
path file('CMakeLists.txt')
version '3.10.2'
}
}
buildFeatures {
viewBinding true
}
sourceSets {
main {
jniLibs.srcDirs += ['libs']
}
}
}

dependencies {

implementation 'androidx.core:core-ktx:1.7.0'
implementation 'androidx.appcompat:appcompat:1.4.0'
implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.2'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'

}

El archivo CMAKELists.txt correspondiente es el siguiente:

cmake_minimum_required(VERSION 3.10.2)

project(“coreandroidtrial”)

add_library( # Sets the name of the library.
coreandroidtrial

# Sets the library as a shared library.
SHARED
src/main/cpp/native-lib.cpp)

set_target_properties(coreandroidtrial PROPERTIES LINK_FLAGS “-Wl,-rpath,’$ORIGIN'”)

find_library(
log-lib

log)

target_link_libraries(
coreandroidtrial PRIVATE
${PROJECT_SOURCE_DIR}/libs/${ANDROID_ABI}/libDepthTester.so
${log-lib})

Según la documentación, el archivo nativo necesario AppInterface.h es el siguiente:

pragma once

/* These functions define the interface between cross-platform sample
application code and platform-specific wrappers. /
namespace AppInterface {
/
On desktop platforms this function is called in main() before
runUntilWindowClosed(). On Android it is called when the main activity
is created. */
void setup();

/** On desktop platforms this function is called in main() after
    runUntilWindowClosed(). On Android it is called when the main activity
    is destroyed. */
void teardown();

/** See Window::renderFrameInGLSurfaceViewContext(). */
void renderFrame(unsigned currentWidth, unsigned currentHeight, float scaleFactor);

/** See Window::updateMouseState(). */
void updateMouseState(bool down, int x, int y);

/** For applications that require Structure Core USB support. The argument
    is a file descriptor from the Android UsbDeviceConnection API and should
    be passed to ST::registerSensorByUSBFileDescriptor() or equivalent. */
void plugStructureCoreFileDescriptor(int fd);


/** For applications requiring CLI command support, this function will be processed before getting any GUI level setup*/
void cliCmdHandler(int argc, char **argv);

}

Dentro de mi propio archivo native-lib.cpp predeterminado solo hay definiciones de funciones JNIEXPORT con sus respectivas llamadas a la ApplicationInterface:

include <jni.h>

include

include

include “AppInterface.h”

extern “C” JNIEXPORT jstring JNICALL
JavacombridgewizstructurecorecoreandroidtrialMainActivitystringFromJNI(
JNIEnv* env,
jobject /* this */) {
std::string hello = “Hello from C++ v4”;
return env->NewStringUTF(hello.cstr());
}
extern “C”
JNIEXPORT void JNICALL
Java
combridgewizstructurecorecoreandroidtrialMainActivitysetupApp(JNIEnv *env, jobject thiz) {
AppInterface::setup();
}
extern “C”
JNIEXPORT void JNICALL
Java
combridgewizstructurecorecoreandroidtrialMainActivityteardownApp(JNIEnv *env,
jobject thiz) {
AppInterface::teardown();
}
extern “C”
JNIEXPORT void JNICALL
Java
combridgewizstructurecorecoreandroidtrialMainActivityrenderFrame(JNIEnv *env,
jobject thiz,
jint current
width,
jint currentheight,
jfloat scale
factor) {
AppInterface::render

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    A partir del mensaje de error dado, parece que hay un problema al cargar la biblioteca “libStructure.so”. Específicamente, no puede encontrar el símbolo “__sfp_handle_exceptions” que es referenciado por la biblioteca. Esto podría deberse a múltiples razones, como versiones incorrectas de la biblioteca o dependencias faltantes.

    Para abordar este problema, podemos intentar los siguientes pasos:

    1. Verifique si la biblioteca está construida con la herramienta y arquitectura correctas. Dado que la aplicación se construye para la arquitectura “arm64-v8a”, asegúrese de que la biblioteca también esté construida para la misma arquitectura utilizando la herramienta NDK.

    2. Verifique si todas las dependencias requeridas por la biblioteca están instaladas en el dispositivo o emulador donde se está probando la aplicación. Esto incluye tanto dependencias de nivel de sistema como de terceros.

    3. Asegúrese de que la biblioteca esté cargada antes que cualquiera de las bibliotecas dependientes. Esto se puede lograr mediante la configuración de la ruta de búsqueda de biblioteca adecuada utilizando la variable de entorno “LD_LIBRARY_PATH” o mediante el uso de la función “dlopen()” para cargar la biblioteca en tiempo de ejecución.

    4. Si el problema persiste, intente construir la biblioteca desde la fuente utilizando la última versión disponible de la API y/o herramienta NDK. Esto puede ayudar a asegurar que todas las dependencias y configuraciones requeridas estén en su lugar.

    5. Finalmente, si ninguno de los pasos anteriores funciona, intente comunicarse con el equipo de soporte de Structure Sensor para obtener más ayuda para resolver el problema. Pueden proporcionar más información sobre cualquier problema conocido o soluciones alternativas.

Comments are closed.