Android游戏开发实践(1)之NDK与JNI开发03

Android游戏开发实践(1)之NDK与JNI开发03

前已经享受了简单首关于Android平台NDK与JNI开发有关的始末。以下列举前面两首的链接地址,感兴趣的得再次回首下。那么,这首延续这有点专题,主要分享下AndroidStudio下之NDK与JNI开发的相干操作及简述下CMake的以。最后,会盖一个实例来收是有点专题的分享,那个,就置身最后一篇吧。

作者:AlphaGL。版权所有,欢迎保留原来文链接进行转载
🙂

传送门:
Android游戏开发执行(1)之NDK与JNI开发01
Android游戏开发实践(1)之NDK与JNI开发02

本文的目如下:

  • 1、环境搭建
  • 2、创建一个支撑C/C++的色
    • 2.1
      新建项目
    • 2.2
      扩展现有项目
  • 3、AndroidStudio与Gradle
    • 3.1
      project/build.gradle
    • 3.2
      project/settings.gradle
    • 3.3
      module/build.gradle

1、 环境搭建

一旦给AndroidStudio支持NDK开发,除了要安装AndroidStudio2.2上述的本。还得装NDKCMakeLLDB等工具。
在AndroidStudio中选择Tools->Android->SDK Manager->SDK
Tools。如图:

此地大概介绍下:
NDK:是Android开发本土C/C++代码的均等效工具集。
CMake:一模拟越平台的构建工具,可以Gradle脚本配合以来构建而的本地库。在AndroidStudio中,Google默认和推举应用CMake进行编译,当然,你依然可以持续运用ndk-build来编译你的地面代码。注意:32个之操作系统可能会见装作不齐。
LLDB: 一栽调试器,Android Studio中得用它们来调节本地代码。

2、 创建一个支持C/C++的花色

这边所说的创立一个支撑C/C++的品类,可以知晓也开创一个NDK项目,但又带有两种植方法,分别是由零碎从头新建一个支撑C/C++开发的档次与于原来项目之根基及吃它支持C/C++开发。下面对当时点儿种植方法分别展开说明下。

2.1 新建项目

只要安好了,上面介绍的几乎独器(主要是NDK),并且AndroidStudio2.2上述的本,新建项目的时,会相这选项。如图:

创造项目时,勾选C++支持。


花色遭到所用之C++标准可选默认或者支持C++11,以及是否支持大和rtti特性。


创建了路,会比一般的Android项目多发生cpp目录和CMakeLists.txt的文件。


此处指定NDK的路线。即,上面环境搭建里安之ndk,会生充斥及AndroidStudio根目录下的ndk-bundle文本夹着。


make一下当下初创的工程,默认会在build/cmake/debug/obj/下别对应的动态库。

2.2 扩展现有项目

假如叫现有的Android项目会调用本地C/C++代码或者支持C/C++开发,只需要以原先种的根基稍加修改即可。步骤如下:

切换到project视图,打开module即达到图的app模块,在src/main下右键New->Directory,填写一个文本称,例如:cpp


以刚刚盖之cpp路径下,右键New->C/C++ Source
File,输入文件称,若一旦一如既往连生成对应的.h文件,勾选Create an associated
header选项即可。注意,后面可以靠定源文件之后缀,例如:.cxx,.hxx


每当module的到底目录就达标图的app根目录,右键New->File,输入CMakeLists.txt。注意:文件称必须也CMakeLists.txt


于module的清目录就达标图的app根目录,选择Link C++ Project with
Gradle,然后,找到刚创立的CMakeLists.txt文件。将CMakeLists.txt干到花色面临。注意,Build
System仍可以选ndk-build道展开编译。

理所当然,这步操作为得以手动完成,相当给以此时此刻module下的build.gradle脚本中,添加了之类代码,

android {
    //指定使用CMake编译----------------
    externalNativeBuild {
        cmake {
            path 'CMakeLists.txt'
        }
    }
    //--------------------------------
} 

打开新建的CMakeLists.txt文件,输入如下代码:

cmake_minimum_required (VERSION 3.4.1)

add_library (hellojni SHARED src/main/cpp/hellojni.cpp)

个别指定CMake要求的版本,add_library中参数分别是,指定生成库的号,生成库的花色,默认是静态块,即:·a,源码的门道。这里实例只简单介绍下CMake的用法,后续会发特别一首来介绍下CMake更多高档的用法。

如上了,在make一下时工程,或者rebuild一下,不出意外会在build/intermediates/cmake/debug路下别各种libhellojni.so文件。

3、AndroidStudio与Gradle

点提到,将CMakeLists.txt关联到花色面临,会以build.gradle脚本中,添加同段落代码即可。可能正接触AndroidStudio(特别是采用外IDE开发的,例如:eclipse等)对Gradle不是那个了解,这里虽丢掉砖引玉下,简要讲述生gradle脚本的采取。

第一,AndroidStudio是依据IntelliJ
IDEA的IDE,在AndroidStudio中初创办的Android工程都显得若如下结构:

MyApp  
├── build.gradle  
├── settings.gradle  
└── app  
    ├── build.gradle  
    ├── build  
    ├── libs  
    └── src  
        └── main  
            ├── java  
            │   └── com.package.myapp  
            └── res  
                ├── drawable  
                ├── layout  
                └── etc.  

MyApp是项目名为,app是模块名,一个类下得以分包几独模块。这跟eclipse的结构不一,对许到eclipse中,app就相当给路名为,MyApp相当给工作空间。或者类似于VS中化解方案及品种之涉。以上目录结构关系,并无跟事实上磁盘上的目结构对应。可以看来,在档次根本目录下与模块目录下,分别产生三单.gradle文本。下面,就分别介绍这三独gradle脚本的用,当然这里要说之凡当AndroidStudio下之gradle的连锁应用。

在AndroidStudio中android项目是基于gradle进行构建的(eclipse中可采用ant来开类似的干活),而gradle是一样种基于Groovy语言的DSL(domain-specific
language,领域专用语言),而Groovy又是一模一样种植基于JVM的动态语言。所以,有java基础之语,理解Groovy会更易。有关Gradle文档可以看看这:
https://docs.gradle.org/current/dsl/

3.1 project/build.gradle

该build.gradle位于项目之彻底目录,该公文是概念在是工程下的兼具模块的国有性质。默认如下:

// Top-level build file where you can add configuration options common to all sub-projects/modules.

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

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

以下只是于表象说明下,但本质是Groovy相应的数据结构(闭包,Map等)调用相应措施来动态控制整个构建过程。有关Groovy的座谈好望3.3
module/build.gradle。
buildscript:定义了大局的相关属性。
repositories:定义了长途仓库的源,即意味着你的借助包之源于。这里拿jcenter()作为仓库。
dependencies:定义了android gradle plugin的版本。
allprojects:可以用来定义各个模块的默认属性,你可不仅仅局限为默认的布,未来若可自己创立tasks在allprojects方法体内,这些tasks将会晤以富有模块中可见。
task clean:执行相关的清理任务。

3.2 project/settings.gradle

该文件在项目根目录下,也是项目之全局配置文件,该文件的情节如下:

include ':app'

而,你的花色面临生多个模块时,可以依次增长到该文件中。例如:

include ':app',':librarys:Mylibrary'

即便当类型根本目录下的librarys目录里产生个Mylibrary库工程。

3.3 module/build.gradle

欠公文在当前模块的根目录下,通常情况下,该公文才针对目前模块于作用。例如:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 24
    buildToolsVersion "24.0.2"
    defaultConfig {
        applicationId "com.alphagl.test"
        minSdkVersion 19
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    externalNativeBuild {
        cmake {
            path 'CMakeLists.txt'
        }
    }
}

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

如上内容,要清弄明白,得深究下Groovy语法。这里,只分析下。
apply plugin:
‘com.android.application’
:在Groovy中的调用为project.apply([plugin:
‘com.android.application’]),plugin: 'com.android.application会为看作一个Map参数传递给apply的措施。这里是如果以该模块构建为一个使用,若使将模块构建库形式,可以传参为plugin: 'com.android.library

于Groovy中花括号包含的一些号称一个闭包(Closure)。上面的基本点两片段androiddependencies,分别针对诺project中之办法,而参数是相应的闭包结构。通过上面的结构,可以理解该闭包结构还有闭包嵌套和对应的措施。
android:该方式包含了拥有的Android属性,而唯一要包含属性为compileSdkVersion和buildToolsVersion。
compileSdkVersion:该法包含编译该app时候,使用到之api版本。
buildToolsVersion:该措施包含构建工具的版本号。
defaultConfig:该法包含app的着力属性,该属性会覆盖于AndroidManifest.xml中的对应属性。
applicationId:该方法定义的属于性会覆盖AndroidManifest文件中之包名package
name属性。
minSdkVersion:该方法定义之习性表示最小支持api版本。同AndroidManifest中对应之性。
targetSdkVersion:该措施定义之属性表示目标平台api版本。同AndroidManifest中对应之习性。
buildTypes:该方法定义了构建不同版本的app相关的习性。
release:配置release版本相关的性能。
minifyEnabled:是否开展模糊。
proguardFiles:定义混淆文件之职。通过getDefaultProguardFile方法赢得。
externalNativeBuild:native使用cmake编译。
dependencies:gradle默认的习性之一,定义了具有的依赖包。
compile:编译相应依赖之jar包。组织称,包名,版本号的组织。

上述只是简简单单的罗列了生有属性,对gradle脚本有起的询问。当然,Groovy在java领域还是有不少用的。感兴趣之,可以深入了解下。

Groovy文档:
Groovy-Documentation

技术交流QQ群:528655025
作者:AlphaGL
出处:http://www.cnblogs.com/alphagl/
版权所有,欢迎保留原文链接进行转载 🙂