Android Gradle,不同架构的本地库

6

我正在尝试构建适用于所有架构的通用apk。 这是我的项目结构:

-App
    -appModule
    -libraryModule
         -libs
             -armeabi
                 -lib.so
         -src
             -java
             -jni

Here is my gradle file for libraryModule:

apply plugin: 'com.android.library'

//    https://dev59.com/kofca4cB1Zd3GeqPn9Bd


android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        ndk {
            moduleName "ProxyResolver" // <-- This is the name of AndroidProxy native module
            stl "gnustl_shared"
            cFlags "-std=c++11"
            abiFilters = ['armeabi']
            ldLibs (projectDir.absolutePath + "/libs/armeabi/libresolver.so")
        }
    }

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

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

正如您所看到的,库的路径是 硬编码 的。目前它仅在 arm-v7 处理器上 可用。但我需要在不添加口味的情况下添加对 x86 的支持。

2个回答

2

我猜:

ndk {

    moduleName "resolver"
    stl "gnustl_shared"
    cFlags "-std=c++11"
    abiFilters = ['armeabi','arm-v7']
}

并移除

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

我尝试了你的变体,但对我来说不起作用。libresolver.so是一个外部库,因此我认为它不应该与模块具有相同的名称。我有一个名为ProxyResolver的模块,需要so库libresolver.so。 - Vetalll

0
在您的defaultConfig中设置abiFilters仅添加应用程序功能信息(仅对安装程序有用,即当要安装的设备不兼容时,安装程序会报错),并不会更改添加到最终apk中的二进制文件。请参见https://dev59.com/uprga4cB1Zd3GeqPp6MI#39445685
我猜您想实现的是为不同的架构创建不同的apk。这是一个常见的用例,即为了减小构建大小。您可以通过在应用程序的build.gradle中使用splits来实现此目的。请参阅https://developer.android.com/studio/build/configure-apk-splits.html
我强烈推荐https://www.neotechsoftware.com/blog/native-libraries-part-i-common-pitfalls(我不是作者)。

关于使用库/aar的注意事项: 然而,当你使用库(aar而不是apk)时,有一个主要的陷阱。在我看来,你不能(自动地)创建不同ABI特定的aar。相反,你需要创建包含所有ABI二进制文件的aar。当将aar添加到Android应用程序时,你需要在应用程序的build.gradle中指定splits,如上所述。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接