在 android studio 使用 .So 文件

Use .So file in android studio

我正在为 device 开发一个应用程序,它本身有一个 SDK

当我尝试将其 SDK 作为库导入我的应用程序时,我会收到如下错误:

E/MultiWindowProxy: getServiceInstance failed!
E/MultiWindowProxy: getServiceInstance failed!
E/AndroidRuntime: FATAL EXCEPTION: Thread-571
    Process: cards.mena.app, PID: 9484
    java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/cards.mena.app-2/base.apk"],nativeLibraryDirectories=[/data/app/cards.mena.app-2/lib/arm, /vendor/lib, /system/lib]]] couldn't find "libserial_port.so"
        at java.lang.Runtime.loadLibrary(Runtime.java:367)
        at java.lang.System.loadLibrary(System.java:1076)
        at android_serialport_api.SerialPort.<clinit>(Unknown Source)
        at com.rt.printerlibrary.driver.serialport.ComDriver.a(Unknown Source)
        at com.rt.printerlibrary.driver.serialport.ComDriver.run(Unknown Source)

我将 .Jar 文件和 .so 放入我的应用程序的 libs 文件夹中,如下所示:

这是我的 Gradle 文件:

android {

    compileSdkVersion 28
    defaultConfig {
        applicationId "cards.mena.app"
        minSdkVersion 21
        targetSdkVersion 28
        versionCode 10002
        versionName "1.0.2"
        setProperty("archivesBaseName", "MenaCards-v$versionName")
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        vectorDrawables.useSupportLibrary = true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }


    dataBinding {
        enabled = true
    }


    sourceSets {
        main {
//            manifest.srcFile 'AndroidManifest.xml'
            jniLibs.srcDirs = ['libs']
            //    java.srcDirs = ['src']
//            resources.srcDirs = ['src']
            assets.srcDirs = ['assets']
        }


    }

}

androidExtensions {
    experimental = true
}

kapt {
    generateStubs = true
}


dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')

    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation "org.jetbrains.anko:anko-commons:0.10.8"

    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'com.google.android.material:material:1.0.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation "com.android.support:design:$supportLibraryVersion"

    /*----------------/ Printer Libs \---------------------------*/
    implementation files('libs/printer_library_ap02.jar')

更新: 我将 Gradle 表单 3.5.0 降级为 2.3.2,我的应用程序现在可以正常工作了!

那么问题是Gradle!这与我有什么关系?

我将我的 .so 文件放在 src > main > jniLibs 和体系结构相关的子文件夹 arm64-v8a, armeabi-v7a, ... 中。不需要额外的配置。也许这对你有帮助。

我找到了问题及其答案。

问题是关于 Gradle 版本的,我不得不添加这一行:

defaultConfig {
    ndk {
        abiFilters 'armeabi'
    }
}

我找到了解决方案,您不必将其作为 gradle 依赖项添加到 gradle 应用程序文件中。

android{

sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
            assets.srcDirs = ['assets']
        }
    }

}

我遇到了同样的问题,正如@Ehsan 所建议的那样。

不过我想指出一点,您不需要降级 gradle。

如果您想将 .so 文件放在 libs 文件夹中,则需要添加

sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
            assets.srcDirs = ['assets']
        }
    }

如果您已经将它们添加到 jniLibs 文件夹中,则不需要。

然后添加

defaultConfig {
    ndk {
        abiFilters 'armeabi'
    }
}

一切顺利。