如何建立一个APK使用Andoid NDK和摇篮 [英] How to build single APK with Andoid NDK and Gradle

查看:163
本文介绍了如何建立一个APK使用Andoid NDK和摇篮的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的OpenCV(C ++不是Java)在一个新的Andr​​oid应用程序的工作,我是新来的OpenCV都和NDK。我把它建设(和运行)成功地使用下面的摇篮文件,并在Android Studio中我可以选择一个变体和击筑(如86)。

我有2个问题:


  1. 有没有一种方法可以让我有一个构建一个APK支持所有架构的变种? (我知道文件大小将更大)

  2. 我能实现构建,而不指定所有相同的库对每个变种。有没有什么办法可以使构建系统只需拿起库因为每次他们都内的项目和建筑名称组织的?

     应用插件:'com.android.application安卓{
    compileSdkVersion 21
    buildToolsVersion21.0.0defaultConfig {
        的applicationIDuk.co.xxx.androidcppimagereader
        17的minSdkVersion
        targetSdkVersion 21
        版本code 1
        的versionName1.0
    }高清libsDir = projectDir.path +/库/productFlavors {
        86 {
            版本code的Integer.parseInt(3+ defaultConfig.version code)
            NDK {
                abiFilter86
                MODULENAME处理
                STLgnustl_static
                CFLAGS-I /选择/本地/包括/ OpenCV的-I /选择/本地/包括
                LDLIBS libsDir +86 / libopencv_core.a
                LDLIBS libsDir +86 / libopencv_ts.a
                LDLIBS libsDir +86 / libopencv_contrib.a
                LDLIBS libsDir +86 / libopencv_ml.a
                LDLIBS libsDir +86 / libopencv_java.so
                LDLIBS日志
                LDLIBSZ,jnigraphics
            }
        }
        {的ARMv7
            版本code的Integer.parseInt(2+ defaultConfig.version code)
            NDK {
                abiFilterarmeabi-V7A
                MODULENAME处理
                STLgnustl_static
                CFLAGS-I /选择/本地/包括/ OpenCV的-I /选择/本地/包括
                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日志
                LDLIBSZ,jnigraphics
            }
        }
        手臂{
            版本code的Integer.parseInt(1+ defaultConfig.version code)
            NDK {
                abiFilterarmeabi
                MODULENAME处理
                STLgnustl_static
                CFLAGS-I /选择/本地/包括/ OpenCV的-I /选择/本地/包括
                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日志
                LDLIBSZ,jnigraphics
            }
        }}    buildTypes {
             发布 {
                minifyEnabled假
                proguardFiles getDefaultProguardFile('proguard的-android.txt'),'proguard-rules.pro
            }
        }
    }依赖{
        编译文件树(导演:'库',包括:['的* .jar'])
        编译com.android.support:appcompat-v7:21.0.3
    }



解决方案

使用关键字胖你已经定义了你计划在的build.gradle文件您的APK,包括作为$ C $高亮所有架构后, C以下。这将建立一个FAT二进制文件。观看此视频,了解更多详情 https://www.youtube.com/watch?v=kFtxo7rr2HQ

  ARM {
    版本code的Integer.parseInt(1+ defaultConfig.version code)
    NDK {
        abiFilterarmeabi
        MODULENAME处理
        STLgnustl_static
        CFLAGS-I /选择/本地/包括/ OpenCV的-I /选择/本地/包括
        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日志
        LDLIBSZ,jnigraphics
    }
  **脂肪**
}buildTypes {
    发布 {
        minifyEnabled假
        proguardFiles getDefaultProguardFile('proguard的-android.txt'),'proguard-rules.pro
    }
}

I am working on a new android app using OpenCV (C++ not Java) and I am new to both opencv and the NDK. I have it building (and running) succesfully using the Gradle file below and in Android Studio I can select a variant and hit build (e.g. x86).

I have 2 questions:

  1. Is there a way I can have a variant that builds an APK supporting all architectures? (I know file size will be bigger)
  2. Can i achieve a build without specifying all the same libs for each variant. Is there any way I can make the build system just pick up the libraries each time since they are all inside the project and organised by architecture name?

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

解决方案

Use the keyword "fat" after you have defined all architectures that you plan to include in your apk in the build.gradle file as highlighted in the code below . This will build a FAT binary. Watch this video for more details 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**
}

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

这篇关于如何建立一个APK使用Andoid NDK和摇篮的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆