Android библиотеки Tensorflow Lite C ++. SO, не связанные во время выполнения - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь собрать Tensorflow lite с C ++ изначально на устройстве Android. Я построил .SO-файл tenorsflow для каждой архитектуры и поместил в папку jniLibs. Это мой файл Cmake:

set(pathToProject /ih/user/project/NativeTfLite/app)

set(libs ${pathToProject}/src/main/jniLibs)
add_library(libtensorflowLite SHARED IMPORTED
        )
set_target_properties(libtensorflowLite PROPERTIES IMPORTED_LOCATION
        ${libs}/${ANDROID_ABI}/libtensorflowLite.so)

find_library( 
        log-lib
        log )

add_library(
        native-lib
        SHARED
        native-lib.cpp)

target_include_directories(native-lib PRIVATE
        ${lib}/include)

target_link_libraries( # Specifies the target library.
        native-lib.     #Problem is here when linking native-lib with libtensorflowlite
        libtensorflowLite
        ${log-lib} )

Во время компиляции эти файлы найдены. Однако в строке target_link_libraries, при связывании 2 библиотек libtensorflowlite и native-lib есть среда выполнения cra sh со следующей ошибкой:

java .lang.UnsatisfiedLinkError: ошибка dlopen: библиотека "/ Users /ih/project/cameraFrames/NativeTfLite/app/src/main/jniLibs/arm64-v8a/libtensorflowLite.so "не найден

Кроме того, файлы .SO не связаны с APK.

Вот мой файл build.gradle:



apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.3"

    defaultConfig {
        applicationId "com.proj.nativetflite"
        minSdkVersion 24
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        sourceSets {
            main {
                jniLibs.srcDir 'src/main/jniLibs'
                jniLibs.srcDirs = ["src/main/jniLibs"]
            }
        }
        externalNativeBuild {
            cmake {
                cppFlags "-std=c++11"
                arguments '-DCMAKE_VERBOSE_MAKEFILE=ON'
            }
        }
        ndk {
            abiFilters  "armeabi-v7a", "x86" , "arm64-v8a"
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
            version "3.10.2"
        }
    }
}

dependencies {
    implementation fileTree(dir: 'jniLibs', include:  '**/*.so')

    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.core:core-ktx:1.2.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

Что вызывает это?

1 Ответ

0 голосов
/ 04 мая 2020

До AGP 4.0 вам необходимо явно упаковать предварительно собранные библиотеки с jniLibs: https://developer.android.com/studio/projects/gradle-external-native-builds#jniLibs. Обратите внимание, что в документах говорится, что вам не нужно делать это для чего-либо, объявленного CMake, но я вполне уверен, что документы здесь не правы (я обратился к владельцу do c, чтобы узнать, нужно ли нам это исправить это или нет, так как является верным для 4.0).

Это должно быть ненужным в 4.0, но это еще не достигло стабильного.

...