Ссылка на внешнюю общую библиотеку android ndk - PullRequest
0 голосов
/ 04 марта 2020

Я собрал python3 с помощью android -ndk toolchain (встроенный llvm), и я пытаюсь связать свой проект в студии android. Сборка завершается без ошибок, но когда я запускаю приложение, я получаю эту ошибку:

28926-28926/com.e.python3 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.e.python3, PID: 28926
    java.lang.UnsatisfiedLinkError: dlopen failed: library "/home/user/AndroidStudioProjects/Python3/app/src/main/cpp/../jniLibs/x86/libpython3.8.so" not found
        at java.lang.Runtime.loadLibrary0(Runtime.java:1016)
        at java.lang.System.loadLibrary(System.java:1657)
        at com.e.python3.MainActivity.<clinit>(MainActivity.java:12)
...

Другие потоки, которые я нашел по этой теме, связаны с экспортом библиотеки в apk, но в моем случае apk имеет lib в каталоге lib (я вижу его через adb или с помощью анализатора apk).

Я следовал руководству по адресу: https://developer.android.com/studio/projects/configure-cmake

Вот мой CMakeLists.txt:

cmake_minimum_required(VERSION 3.4.1)

add_library( # Sets the name of the library.
        native-lib
        SHARED
        native-lib.cpp)

find_library(
        log-lib
        log)

include_directories(
        /home/user/PythonBuild/python390.${CMAKE_ANDROID_ARCH_ABI}/include/python3.8
)

add_library(python3 SHARED IMPORTED)
set_target_properties(python3 PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../jniLibs/${CMAKE_ANDROID_ARCH_ABI}/libpython3.8.so)

target_link_libraries(
        native-lib
        python3
        ${log-lib})

И мой выпускник:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.e.python3"
        minSdkVersion 23
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                cppFlags ""
            }
        }
        ndk {
            moduleName "jnilib"
        }
    }
    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"
        }
    }
    splits {
        abi {
            enable true
            reset()
            include 'x86_64', 'armeabi-v7a', 'arm64-v8a', 'x86'
            universalApk false
        }
    }

    sourceSets {
        main {
            jniLibs.srcDirs = ['src/main/jniLibs']
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    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 Ответ

0 голосов
/ 04 марта 2020

Я нашел ответ там: Использование встроенной общей библиотеки в Android Studio (cmake) благодаря @ Michael

Я изменил INSTSONAME при компиляции python, чтобы отменить версионная часть библиотеки (lib python3 .8.so.1.0 -> lib python3 .8.so). Это также отбросило SONAME. Используя patchelf, я смог добавить SONAME, и библиотека была найдена.

...