NDK开发 Android Studio环境搭建

时间:2022-12-23 17:22:26

Android Studio环境搭建

转载:http://gnaixx.cc/2016/03/07/ndk-android_studio-dev-env/

0.4.0是ExperimentalPlugin版本所以在使用的时候和正式版本的配置还是有挺大的差别的。官方文档官网。上面给出了Experimental Plugin版本使用说明,但是实际使用中还是发现了不少问题,比如签名配置。

0x00 Change Config

主要修改包括三个文件

  • [1]
    ./app/build.gradle
  • [2]
    ./build.gradle
  • [3]
    ./gradle/wrapper/gradle-wrapper.properties

每个插件版本都对应着一个gradle版本

Plugin Version Gragle Version
0.1.0 2.5
0.2.0 2.5
0.3.0-alpha3 2.6
0.4.0 2.8
0.6.0-alpha1 2.8
0.6.0-alpha5 2.10

因为我使用的是0.4.0版本所以需要将
./gradle/wrapper/gradle-wrapper.properties
中配置改为

#Wed Oct 21 11:34:03 PDT 2015
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https://services.gradle.org/distributions/
gradle-2.8-all
.zip

./build.gradle

修改classpath为当前的0.4.0版本插件

buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle-experimental:0.4.0'

// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}

allprojects {
repositories {
jcenter()
}
}

task clean(type: Delete) {
delete rootProject.buildDir
}

./app/build.gradle

./app/build.gradle文件需要改动的东西比较多,很多配置与正式版本不一样。

  • ‘com.android.model.application’
    替换
    ‘com.android.application’
    如果是library模块改为
    com.android.model.library
  • 在android外层添加根节点model { }
  • 需要添加=给属性赋值
  • 添加元素需要用add函数
    下面这个是我自己项目的配置:
apply plugin: 'com.android.model.application'

model {
def signConf

android {
compileSdkVersion = 23
buildToolsVersion = "23.0.2"

defaultConfig.with {
applicationId = "com.example.gnaix.ndk"
minSdkVersion.apiLevel = 15
targetSdkVersion.apiLevel = 22
versionCode = 1
versionName = "1.0"

buildConfigFields.with {
create() {
type = "int"
name = "VALUE"
value = "1"
}
}
}
}

//编译设置
android.buildTypes {
release {
minifyEnabled = true
proguardFiles.add(file('proguard-rules.pro'))
signingConfig = signConf
ndk.with {
debuggable = false
}
}
debug{
minifyEnabled = false
proguardFiles.add(file('proguard-rules.pro'))
ndk.with {
debuggable = true
}
}
}

//签名设置
android.signingConfigs {
create("myConfig") {
keyAlias = 'gnaix'
keyPassword = '990828785'
storeFile = new File('/Users/xiangqing/Documents/workspace/android/gnaix.jks')
storePassword = '990828785'
storeType = "jks"
signConf = it
}
}

//ndk定义
android.ndk {
moduleName = "native" //设置库(so)文件名称
//CFlags.add("-DCUSTOM_DEFINE")
ldLibs.addAll(["log", "android", "EGL", "GLESv1_CM"])
//ldFlags.add("-L/custom/lib/path")
stl = "stlport_static"
}

//ndk编译参数
android.productFlavors {
create("arm") {
ndk.abiFilters.add("armeabi")
}
create("arm7") {
ndk.abiFilters.add("armeabi-v7a")
}
create("arm8") {
ndk.abiFilters.add("arm64-v8a")
}
create("x86") {
ndk.abiFilters.add("x86")
}
create("x86-64") {
ndk.abiFilters.add("x86_64")
}
create("mips") {
ndk.abiFilters.add("mips")
}
create("mips-64") {
ndk.abiFilters.add("mips64")
}
// To include all cpu architectures, leaves abiFilters empty
create("all")
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.2.0'
}

0x01 Signing Config

下面这段代码是官方文档给出的签名配置,但是在实际编译中报错了。改成上面的配置则可以了。

PS:之前我都是新建gradle.properties文件配置签名信息,方便多项目应用,可是在这里好像不行。

apply plugin: "com.android.model.application"

model {
android {
compileSdkVersion = 23
buildToolsVersion = "23.0.2"
}

android.buildTypes {
release {
signingConfig = $("android.signingConfigs.myConfig")
}
}
android.signingConfigs {
create("myConfig") {
storeFile = new File("/path/to/debug.keystore")
storePassword = "android"
keyAlias = "androiddebugkey"
keyPassword = "android"
storeType = "jks"
}
}
}

0x02 Source Set

默认情况下C/C++文件是存放在src/main/jni目录下。可以配置android.sources节点改变路径。不过我还是喜欢默认路径。

model {
android {
compileSdkVersion = 22
buildToolsVersion = "22.0.1"
}
android.ndk {
moduleName = "native"
}
android.sources {
main {
jni {
source {
srcDir "src"
}
}
}
}
}

如果有已经编译好的SO包要添加引用:

android.sources {
main {
jniLibs {
dependencies {
library file("./libs/armeabi/libnative.so") abi "armeabi"
library file("./libs/armeabi-v7a/libnative.so") abi "armeabi-v7a"
library file("./libs/x86/libnative.so") abi "x86"
library file("./libs/mips/libnative.so") abi "mips"
}
}
}
}

注意这里需要写SO包命全称,加上lib。

0x03 Other Config

文档中还介绍了将SO作为一个独立的lib编译的方式,在实际操作中我也失败了,当时项目时间紧也就没有研究了=_=#。
文档示例/lib/build.gradle:

apply plugin: "com.android.model.native"

model {
android {
compileSdkVersion = 21
}
android.ndk {
moduleName = "hello"
}
android.sources {
main {
jni {
exportedHeaders {
srcDir "src/main/headers"
}
}
}
}
}

文档中还提到其他配置的使用方法,因为项目中没有用到,我也没试过。
示例项目地址https://github.com/gnaixx/as-ndk

下一篇将会介绍SO开发的JNI调用