《Gradle权威指南》--Android Gradle NDK支持

No1:

在根项目下的local.properties文件中配置

sdk.dir=/home/frame/android/android-sdk
ndk.dir=/home/frame/android/android-ndk

在gradle.properties里配置

android.useDeprecatedNdk=true

No2:

配置so库的模块名,是在build.gradle脚本文件里配置

复制代码
android{
    compileSdkVersion 23
    buildToolsVersion "23.0.1"
    
    defaultConfig{
        applicationId "org.flysnow.app.example132"
        minSdkVersion 14
        targetSdkVersion 23
        versionCode 1
        versionName '1.0.0'
        
        ndk{
            moduleName 'helloworld'
        }
    }
    buildTypes{
        release{
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'
            zipAlignEnabled true
        }
    }
}
复制代码

No3:

android{
    compileSdkVersion 23
    buildToolsVersion "23.0.1"
}

申明NDK级别必须是Android SDK和Android NDK都存在的API级别,否则找不到相应的NDK就会报找不到jni.h这个错误

No4:

多平台编译

生成so文件包含4个平台架构:armeabi、armeabi-v7a、mips、x86

复制代码
android{
    compileSdkVersion 23
    buildToolsRevision "23.0.1"
    
    defaultConfig{
        applicationId  "org.flysnow.app.example132"
        minSdkVersion 14
        targetSdkVersion 23
        versionCode 1
        versionName '1.0.0'
        
        ndk{
            moduleName 'helloworld'
            abiFilters 'armeabi-v7a','x86'
        }
    }
}
复制代码

No5:

第三方的so库放到特定的目录src/main/jniLibs,和jni目录平级

例:x86的so库放在src/main/jniLibs/x86/

armeabi的so库放在src/main/jniLibs/armeabi-v7a/

No6:

使用NDK提供的库,比如:liblog、libz、libandroid等

复制代码
android{
    compileSdkVersion 23
    buildToolsVersion "23.0.1"
    
    defaultConfig{
        applicationId "org.flysnow.app.example132"
        targetSdkVersion 23
        
        ndk{
            moduleName 'helloworld'
            ldLibs 'log','z'
        }
    }
}
复制代码

注:moduleName不能带有lib前缀

No7:

C++库支持

1)libstdc++,默认的,迷你版C++运行库

2)gabi++_static,GAbi++运行库,静态的,支持C++异常和RTTI特性

3)gabi++_shared,GAbi++运行库,动态的,支持C++异常和RTTI特性

4)stlport_static,STLport运行库,静态的,支持C++异常、RTTI和标准库

5)stlport_shared,STLport运行库,动态的,支持C++异常、RTTI和标准库

6)gnustl_static,GUN STL,静态的,支持C++异常、RTTI和标准库

7)gnustl_shared,GUN STL,动态的,支持C++异常、RTTI和标准库

8)c++_static,LLVM libc++运行库,静态的,支持C++异常、RTTI和标准库

9)c++shared,LLVM libc++运行库,动态的

例:

在Application.mk中配置

APP_STL :=gnustl_static

gradle中配置

复制代码
android{
    defaultConfig{
        ndk{
            moduleName 'helloworld'
            abiFilter 'armeabi-v7a'
            abiFilter 'x86'
            ldLibs 'log','z'
            stl 'gnustl_static'
        }
    }
}
复制代码

------------------------------------

启用C++异常

APP_CPPFLAGS += -fexceptions

gradle配置

复制代码
android{
    defaultConfig{
        ndk{
            moduleName 'helloworld'
            abiFilter 'armeabi-v7a'
            abiFilter 'x86'
            ldLibs 'log','z'
            stl 'gnustl_static'
            cFlags '-fexceptions'
        }
    }
}
复制代码

启用RTTI

复制代码
android{
    defaultConfig{
        ndk{
            moduleName 'helloworld'
            abiFilter 'armeabi-v7a'
            abiFilter 'x86'
            ldLibs 'log','z'
            stl 'gnustl_static'
            cFlags '-fexceptions -frtti'
        }
    }
}
复制代码

 持续集成平台可以使用Jenkins

posted @   嘉禾世兴  阅读(801)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
历史上的今天:
2016-03-28 Xml解析
点击右上角即可分享
微信分享提示