Link 外部共享库 android ndk

Link external shared library android ndk

我已经使用 android-ndk 工具链(预构建的 llvm)构建了 python3,我正在尝试 link 针对我在 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)
...

我在该主题上发现的其他线程与将 lib 导出到 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})

还有我的 gradle:

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

奇怪的是,它试图使用构建它的计算机的路径打开共享库,而不是 apk 之一。

我在那里找到了答案: Using a prebuilt shared Library in Android Studio (cmake)感谢@Michael

我在编译 python 时更改了 INSTSONAME 以丢弃库的版本化部分 (libpython3.8.so.1.0 -> libpython3。 8.so)。这样做也会丢弃 SONAME。 使用 patchelf 我能够添加 SONAME 并且找到了库。