微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用Android NDK和Gradle构建单个APK

我正在使用OpenCV(C而不是Java)开发一个新的Android应用程序,我是opencv和NDK的新手.我使用下面的Gradle文件成功构建(并运行),在Android Studio中我可以选择一个变体并点击构建(例如x86).

我有两个问题:

>我有没有办法建立一个支持所有架构的APK? (我知道文件大小会更大)
>我可以实现构建而不为每个变体指定所有相同的库.有没有什么办法可以让构建系统每次都拿起库,因为它们都在项目内部并按体系结构名称组织?

apply plugin: 'com.android.application'

android {
compileSdkVersion 21
buildToolsversion "21.0.0"

defaultConfig {
    applicationId "uk.co.xxx.androidcppimagereader"
    minSdkVersion 17
    targetSdkVersion 21
    versionCode 1
    versionName "1.0"
}

def libsDir = projectDir.path + "/libs/"

productFlavors {
    x86 {
        versionCode Integer.parseInt("3" + defaultConfig.versionCode)
        ndk {
            abiFilter "x86"
            moduleName "Processing"
            stl "gnustl_static"
            cFlags "-I/Opt/local/include/opencv -I/Opt/local/include"
            ldLibs libsDir + "x86/libopencv_core.a"
            ldLibs libsDir + "x86/libopencv_ts.a"
            ldLibs libsDir + "x86/libopencv_contrib.a"
            ldLibs libsDir + "x86/libopencv_ml.a"
            ldLibs libsDir + "x86/libopencv_java.so"
            ldLibs "log"
            ldLibs "z", "jnigraphics"
        }
    }
    armv7 {
        versionCode Integer.parseInt("2" + defaultConfig.versionCode)
        ndk {
            abiFilter "armeabi-v7a"
            moduleName "Processing"
            stl "gnustl_static"
            cFlags "-I/Opt/local/include/opencv -I/Opt/local/include"
            ldLibs libsDir + "armeabi-v7a/libopencv_core.a"
            ldLibs libsDir + "armeabi-v7a/libopencv_ts.a"
            ldLibs libsDir + "armeabi-v7a/libopencv_contrib.a"
            ldLibs libsDir + "armeabi-v7a/libopencv_ml.a"
            ldLibs libsDir + "armeabi-v7a/libopencv_java.so"
            ldLibs "log"
            ldLibs "z", "jnigraphics"
        }
    }
    arm {
        versionCode Integer.parseInt("1" + defaultConfig.versionCode)
        ndk {
            abiFilter "armeabi"
            moduleName "Processing"
            stl "gnustl_static"
            cFlags "-I/Opt/local/include/opencv -I/Opt/local/include"
            ldLibs libsDir + "armeabi/libopencv_core.a"
            ldLibs libsDir + "armeabi/libopencv_ts.a"
            ldLibs libsDir + "armeabi/libopencv_contrib.a"
            ldLibs libsDir + "armeabi/libopencv_ml.a"
            ldLibs libsDir + "armeabi/libopencv_java.so"
            ldLibs "log"
            ldLibs "z",  "jnigraphics"
        }
    }

}

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

dependencies {
    compile filetree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.3'
}

解决方法:

在build.gradle文件中定义了计划包含在apk中的所有体系结构之后,请使用关键字“fat”,如下面的代码中突出显示的那样.这将构建FAT二进制文件.观看此视频了解更多详情https://www.youtube.com/watch?v=kFtxo7rr2HQ

arm {
    versionCode Integer.parseInt("1" + defaultConfig.versionCode)
    ndk {
        abiFilter "armeabi"
        moduleName "Processing"
        stl "gnustl_static"
        cFlags "-I/Opt/local/include/opencv -I/Opt/local/include"
        ldLibs libsDir + "armeabi/libopencv_core.a"
        ldLibs libsDir + "armeabi/libopencv_ts.a"
        ldLibs libsDir + "armeabi/libopencv_contrib.a"
        ldLibs libsDir + "armeabi/libopencv_ml.a"
        ldLibs libsDir + "armeabi/libopencv_java.so"
        ldLibs "log"
        ldLibs "z",  "jnigraphics"
    }
    fat // <- HERE
}

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐