GCC学习(1)之MinGW使用

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

GCC学习(1)之MinGW使用

因累打算分享部分关于GCC的利用体验的稿子,就拿这首当作一个不怎么预热,依此来打探下下GNU工具链(gcc、gdb、make等)在脱离IDE的情事下怎样开发同涉嫌的编译相关的原理。当然,这地方的情节开发环境不压制使用MinGW,像前介绍了之Cygwin,或者直接在Linux系列之操作系统及,一般都自带GUN工具。

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

1、 环境搭建

比方让AndroidStudio支持NDK开发,除了要安装AndroidStudio2.2之上之版本。还得设置NDKCMakeLLDB等工具。
在AndroidStudio中选择Tools->Android->SDK Manager->SDK
Tools。如图:
图片 1

此间大概介绍下:
NDK:是Android开发本土C/C++代码的平等拟工具集。
CMake:一效仿越平台的构建工具,可以Gradle脚本配合使用来构建而的地方库。在AndroidStudio中,Google默认和引进使用CMake进行编译,当然,你依旧可以连续用ndk-build来编译你的当地代码。注意:32各类之操作系统可能会见佯装不达到。
LLDB: 一栽调试器,Android Studio中得使用它来调节本地代码。

MinGW介绍

MinGW全称Minimalist GNU for
Windows,也是从Cygwin发展要来之,但又精简。是同模仿将GCC和GNU
Binutils移植到Windows平台的编译工具集。支持编译C、C++、Objective-C、Fortran及Ada等语言(同时,也是GCC支持之言语)。同时,使用MinGW编译出来的主次不需要格外的老三方DLL就会直接以Windows下运行。以上介绍都出自MinGw维基百科,简单的话,就是提供了一致拟于Windows平台也会使用GUN的工具。

MinGW官网:
http://www.mingw.org/

MinGW下载地址:
http://sourceforge.net/projects/mingw/

2、 创建一个支持C/C++的种类

这里所说的缔造一个支撑C/C++的项目,可以掌握为创造一个NDK项目,但还要含有两种植方式,分别是自零星上马新建一个支持C/C++开发之路以及以老项目的基本功及于她支持C/C++开发。下面对就片种方式分别展开认证下。

MinGW安装

MinGW的安步骤非常简短。如图:
图片 2

图片 3

图片 4

图片 5
分别把mingw-developer-toolkitmingw32-basemingw32-gcc-g++msys-base标记下,其它的可选。

图片 6
当Installation->Apply Changes,应用下,就会见自行装所选择的保了。

2.1 新建项目

一旦设置好了,上面介绍的几只器(主要是NDK),并且AndroidStudio2.2之上之版,新建项目之时段,会看这个选项。如图:
图片 7
缔造项目时,勾选C++支持。

图片 8
项目蒙所用之C++标准可以择默认或者支持C++11,以及是否支持大和rtti特性。

图片 9
创办了路,会比一般的Android项目多起cpp目录和CMakeLists.txt的文书。

图片 10
此处指定NDK的门道。即,上面环境搭建里安装的ndk,会下充斥到AndroidStudio根目录下之ndk-bundle文本夹着。

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

配置环境变量

例如:我的MinGW安装在D:\env\MinGW。如图:
图片 12

图片 13

图片 14
并把MINGW_HOMEMINGW_MAKE_HOME添加到Path中。%MINGW_HOME%\bin;%MINGW_MAKE_HOME%\bin;

图片 15
在Windows终端中,输入gcc --versionmake --version,能出口相应的版本信息,则说明配置成功了。

2.2 扩展现有项目

一旦为现有的Android项目会调用本地C/C++代码或者支持C/C++开发,只需要以原来种之底子稍加修改即可。步骤如下:
图片 16
切换到project视图,打开module即达图的app模块,在src/main下右键New->Directory,填写一个文书称,例如:cpp

图片 17
以刚刚盖之cpp路径下,右键New->C/C++ Source
File,输入文件称,若一旦同并扭转对应的.h文本,勾选Create an associated
header选项即可。注意,后面可以凭定源文件的后缀,例如:.cxx,.hxx

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

图片 19
每当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文件。

MinGW使用

新建hello_mingw.chello.hhello.cmakefile,代码如下:
hello_mingw.c

#include <stdio.h>
#include "hello.h"

int main()
{
  printf("hello mingw\n");
  test();
  return 0;
} 

hello.h

#include <stdio.h>

void test();

hello.c

#include "hello.h"

void test()
{
  printf("this is a test");
}

makefile

hello.exe:hello_mingw.o hello.o
    gcc hello_mingw.o hello.o -o hello

hello_mingw.o:hello_mingw.c
    gcc -c hello_mingw.c

hello.o:hello.c hello.h
    gcc -c hello.c

clean:
    rm *.exe *.o

当Windows命令终端中执行如下命令:
图片 20
时至今日成功生成hello.exe,运行并施行了不易的出口。

如上就是是指MinGW来熟悉gcc以及makefile的用的一个稍稍实践。后续还有更多关于gcc相关的内容分享,敬请期待。

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

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/
版权所有,欢迎保留原来文链接进行转载 🙂

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图