概述:
windows下的可执行文件为exe程序,linux下为elf文件。这两种文件只能在各自的平台上运行。此外,window程序含有一个函数库文件,后缀为.dll的文件,而linux程序的函数库是.so文件。一个程序从源码阶段到运行经历了 编译、连接、执行。
拿java来举例:首先由java --> .class --> java虚拟机,这里java虚拟机来模拟windows或者linux的环境来解释执行
.class文件。而C语言呢,首先编译为一个.O的中间文件,在windows环境下在生成.exe, linux环境下生成.elf 可执行文件。
在windows上如果把C语言打包成库文件 则是 dll。 而在linux上打包成库文件 则是.so文件。Android系统底层其实为linux系统,也就是说
linux系统可以运行在ARM 、x86、inter、等处理器上。由于C代码是和底层交互的,因此处理器不同,同样一个linux系统,系统的C代码可能不一样。而现在呢,我们要在windows环境下开发,并且开发一个运行在linux系统上的程序或者库文件,这个linux系统还是基于arm cpu运行的。
由于我们在进行NDK开发。最终目的是写出 在linux系统上的库文件.so. 因此就需要下面2步:
一、模拟基于arm cpu运行的linux环境
二、在模拟的linux环境下 编译 连接c代码,打成so文件
这两步也是环境搭建的2步。
环境搭建:
一、模拟基于arm cpu运行的linux环境,也就是手机环境。 用到的工具是Cygwin 。从网上下载安装即可。
(安装过程中会出现选择安装组件界面。选devel 和shells 选设置为install,只安装这两个项即可。)
说明:
安装目录就是模拟linux的文件系统,就是linux的安装目录。
bin
etc :存放所有的配置文件的目录。
home
lib
usr
var
tmp
要熟悉这些目录 熟悉linux系统即可。如果开发用的系统是linux系统,当然这个工具没必要安装了。
二、在模拟的linux环境下 编译 连接c代码,打成so文件。这就用到NDK工具。
下载地址:https://developer.android.com/ndk/downloads/index.html
NDK的安装:官网下载exe后安装即可
NDK的目录说明:
samples :放置了一下JNI开发例子。初学可以参考学习这里面的例子。
platforms :对应Android的一些平台。这里放置的是一些比较稳定的版本。arch-arm下放的是一些库 和 头文件。
(一般基于Android-8这个版本开发,Android-8目录下有arch-arm和arch-x86两个平台。有少部分一些手机用的x86处理器。大部分还是arm cpu。)
docs:开发文档
ndk-build :安装后目录下有个ndk-build 文件。打开这个文件首行写有:#!/bin/sh ,表明这是一个linux环境下的批处理文件。(windows下为.bat格式)
build :一些批处理文件等工具。
库文件 (.so) 和 头文件 (.h) 是什么:
头文件 是给编译器 来看的,C代码开头引入头文件这么写:#include <stdio.h> , 头文件中定义了一些函数,我们可以理解成接口。
库文件是给连接器来看的。定义了一些头文件中的实现。头文件中的函数定义 都对应与 库文件中的实现。和java的接口类似。头文件相当于接口。
库文件相当于实现类。
环境变量配置:
要用NDK命令来编译C代码,可以在Cygwin 命令界面 也可以在windows的dos界面。
Cygwin:
注意环境变量配置:
打开etc目录下的profile文件
在Path 环境变量下追加 配置即可:/cygdrive/NDK的安装目录/ 例如:/cygdrive/d/setup/android-ndk-r7b
#下面是配置的例子:
PATH="/usr/local/bin:/cygdrive/d/setup/android-ndk-r7b:/usr/bin:${PATH}"
MANPATH="/usr/local/man:/usr/share/man:/usr/man:${MANPATH}"
INFOPATH="/usr/local/info:/usr/share/info:/usr/info:${INFOPATH}"
dos:
在windows系统 我的电脑中 找到环境变量配置,在Path 环境变量中追加 NDK的安装目录即可(;D://NDK...)。这种方式也可以用NDK来编译。
至此,环境已经搭建好了。下面来在Eclipse下 用NDK写一个HelloWorld例子。
配置完成后在Cygwin界面 或者dos界面 打ndk-build 命令 输出错误提示:
Could not find application project directory ..... 表明命令执行了,配置成功。