Android C ++ NDK: некоторые общие библиотеки отказываются ссылаться во время выполнения - PullRequest
0 голосов
/ 30 марта 2020

Я пытаюсь использовать разделяемую библиотеку C / C ++ TensorFlow Lite для моего проекта, и это успешно. Поэтому я добавил еще несколько библиотек, но lib_nnapi.so не может выполнить соединение во время выполнения (System.loadLibrary). Если я удаляю указанную библиотеку c, все работает нормально.

Использование fetchelf для переименования SONAME не удалось с ошибкой cannot locate symbol.

Написал CMakeLists.txt используя Официальный Android ndk пример . Все библиотеки расположены в одних и тех же каталогах.

CMakeLists.txt

cmake_minimum_required(VERSION 3.4.1)


option(BUILD_WITH_OPENCV_4 "Build with OpenCV 4.1.0" ON)
option(BUILD_IN_ANDROID "Build the pupil library in android" ON)
option(BUILD_WITH_GUI "Build with gui version of opencv" OFF)

set(distribution_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../../distribution)

add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/opencv")


add_library(lib_tflite SHARED IMPORTED)
set_target_properties(lib_tflite PROPERTIES IMPORTED_LOCATION
        ${distribution_DIR}/tflite/lib/${ANDROID_ABI}/libtensorflowlite_c.so)

add_library(lib_tflite_gpu SHARED IMPORTED)
set_target_properties(lib_tflite_gpu PROPERTIES IMPORTED_LOCATION
        ${distribution_DIR}/tflite/lib/${ANDROID_ABI}/libtensorflowlite_gpu_delegate.so)

add_library(lib_nnapi SHARED IMPORTED)
set_target_properties(lib_nnapi PROPERTIES IMPORTED_LOCATION
        ${distribution_DIR}/tflite/lib/${ANDROID_ABI}/libnnapi_delegate.so)


set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")

add_library(hello-libs SHARED
        hello-libs.cpp)

target_include_directories(hello-libs PRIVATE
        ${distribution_DIR}/tflite/include
        ${distribution_DIR}/tflite/include/tensorflow/lite/tools/make/downloads
        ${distribution_DIR}/tflite/include/tensorflow/lite/tools/make/downloads/flatbuffers/include
)

target_link_libraries(hello-libs
        android neuralnetworks log
        lib_tflite lib_tflite_gpu
        lib_nnapi    # <- this library fails to link.
        opencv z)

build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 29

    defaultConfig {
        applicationId = 'com.example.hellolibs'
        minSdkVersion 27
        targetSdkVersion 29
        versionCode = 1
        versionName = '1.0'
        externalNativeBuild {
            cmake {
                cppFlags ""
                arguments '-DANDROID_STL=c++_shared'
            }
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'),
                          'proguard-rules.pro'
            ndk {
                abiFilters "arm64-v8a"
            }
        }
        debug {
            ndk {
                abiFilters "arm64-v8a"
            }
        }
    }
    sourceSets {
        main {
            // let gradle pack the shared library into apk
            jniLibs.srcDirs = ['../distribution/tflite/lib']
        }
    }
    externalNativeBuild {
        cmake {
            version '3.10.2'
            path 'src/main/cpp/CMakeLists.txt'
        }
    }
}

dependencies {
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'com.google.android.material:material:1.1.0'
}

Журнал ошибок

2020-03-30 15:38:18.672 22574-22574/com.example.hellolibs E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.hellolibs, PID: 22574
    java.lang.UnsatisfiedLinkError: dlopen failed: library "/Users/yonggyulee/Documents/GitHub/AI-Kit/tflite/c/hello-libs/app/src/main/cpp/../../../../distribution/tflite/lib/arm64-v8a/libnnapi_delegate.so" not found
        at java.lang.Runtime.loadLibrary0(Runtime.java:1016)
        at java.lang.System.loadLibrary(System.java:1669)
        at com.example.hellolibs.MainActivity.<clinit>(MainActivity.java:32)
        at java.lang.Class.newInstance(Native Method)
        at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:69)
        at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:41)
        at android.app.Instrumentation.newActivity(Instrumentation.java:1219)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3040)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3292)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1980)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7168)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:975)
...