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

时间:2023-03-10 02:13:24
《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