Android 开发 NDK从入门到精通

http://blog.csdn.net/shulianghan/article/details/18964835

NDK详解

1. 交叉编译库文件

C代码执行 : C代码被编译成库文件之后, 才能执行, 库文件分为动态库 和静态库 两种;

-- 动态库 : unix环境下.so 后缀的是动态库, windows环境下.dll 后缀的是动态库;
动态库可以依赖静态库加载一些可执行的C代码;

-- 静态库 :.a 后缀是静态库的扩展名;

库文件来源 : C代码 进行 编译 链接操作之后, 才会生成库文件, 不同类型的CPU 操作系统 生成的库文件是不一样;

-- CPU分类 : arm结构, 嵌入式设备处理器; x86结构, pc 服务器处理器; 不同的CPU指令集不同;

-- 交叉编译 :windows x86编译出来的库文件可以在arm平台运行的代码;

-- 交叉编译工具链 : Google提供的 NDK 就是交叉编译工具链, 可以在linux环境下编译出在arn平台下执行的二进制库文件;

NDK作用 : 是Google提供了交叉编译工具链, 能够在linux平台编译出在arm平台下执行的二进制库文件;

NDK版本介绍 : android-ndk-windows 是在windows系统中的cygwin使用的, android-ndk-linux 是在linux下使用的;

2. 部署NDK开发环境

(1) 下载Cygwin安装器

下载地址 : http://cygwin.com/setup-x86.exe , 这是下载器, 可以使用该下载器在线安装, 也可以将cygwin下载到本地之后, 在进行安装;

安装器使用 : Cygwin的下载, 在线安装, 卸载 等操作都有由该安装器进行;

-- 本地文件安装 : 选择安装文件所在的目录, 然后选择所要安装的安装包;

-- 在线安装 : 选择在线安装即可, 然后选择需要的安装包;

-- 卸载 : windows上使用其它软件例如360, 控制面板中是无法卸载Cygwin的, 只能通过安装器来卸载;

(2) 安装Cygin

双击安装器 setup-x86.exe 下一步 : 

选择安装方式 : 

-- 在线安装 : 直接下载, 然后安装;

-- 下载安装文件 : 将安装文件下载下来, 可以随时安装, 注意安装文件也需要安装器来进行安装;

-- 从本地文件安装 : 即使用下载的安装文件进行安装;

选择Cygwin安装位置 : 

选择下载好安装文件位置 : 之前我下了一个完全版的Cygwin, 包括了所有的Cygwin组件, 全部加起来有5.23G, 下载速度很快, 使用网易的镜像, 基本可以全速下载;

选择需要安装Cygwin组件 : 这里我们只需要以下组件 : binutils , gcc , gcc-mingw , gdb , make , 不用下全部的组件;

之后点击下一步等待完成安装即可;

.

安装完之后, 打开bash命令窗口, 可以设置下显示的字体, 使用 make -version 查看是否安装成功 : 

(3) Cygwin目录介绍

以下是Cygwin安装目录的情况 : 该安装目录就是所模拟的linux 的根目录;

对应的linux目录 : 这两个目录进行对比发现, 两个目录是一样的, Cygwin的安装目录就是 linux根目录;

cygdrive目录 : 该目录是Cygwin模拟出来的windows目录结构, 进入该目录后, 会发现windows的盘符目录, 通过该目录可以访问windows中的文件;

(4) 下载NDK工具 

从Google的Android开发者官网上下载该工具, 注意NDK工具分类 : 下载地址 -http://developer.android.com/tools/sdk/ndk/index.html -;

-- windows版本NDK:android-ndk-r9c-windows-x86.zip (32位),android-ndk-r9c-windows-x86_64.zip (64位)
该版本是用在windows上的Cygwin下, 不能直接在windows上直接运行;

-- linux版本NDK :android-ndk-r9c-linux-x86.tar.bz2(32位)
android-ndk-r9c-linux-x86_64.tar.bz2 (64位)
, 该版本直接在linux下执行即可;

在这里下载windows版本的NDK, 运行在Cygwin上;

(4) NDK环境介绍

NDK工具的文件结构 : 

ndk-build脚本 : NDK build 脚本是 gun-make 的简单封装, gun-make 是编译C语言代码的工具, 该脚本执行的前提是linux环境下必须安装 make 程序;

NDK安装在Cygwin中 : 将NDK压缩文件拷贝到Cygwin的根目录中, 解压 : android-ndk-r9c 目录就是NDK目录;

执行以下NDK目录下的 ndk-build 命令 : ./ndk-build ;

执行结果 :

[plain] view
plain
copy

  1. <span style="font-family: 'Courier New';">Android NDK: Could not find application project directory !  
  2. Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.  
  3. /android-ndk-r9c/build/core/build-local.mk:148: *** Android NDK: Aborting    。 停止。</span>  

三. 开发第一个NDK程序

1. 开发NDK程序流程

a. 创建Android工程

首选创建一个Android工程, 在这个工程中进行JNI开发;

b. 声明native方法 : 

注意方法名使用 native 修饰, 没有方法体 和 参数, eg : public native String helloFromJNI();

c. 创建C文件 : 

在工程根目录下创建 jni 目录, 然后创建一个c语言源文件, 在文件中引入 include <jni.h> , C语言方法声明格式 jstring Java_shuliang.han.ndkhelloworld_MainActivity_helloFromJNI(JNIEnv *env) , jstring 是 Java语言中的String类型, 方法名格式为 : Java_完整包名类名_方法名();

-- JNIEnv参数 : 代表的是Java环境, 通过这个环境可以调用Java里面的方法;

-- jobject参数 : 调用C语言方法的对象, thiz对象表示当前的对象, 即调用JNI方法所在的类;

d. 编写Android.mk文件 : 

如何写 查看文档, NDK根目录下有一个 documentation.html 文档, 点击该html文件就可以查看文档, 查看 Android.mk File 文档, 下面是该文档给出的 Android.mk示例 : 

[plain] view
plain
copy

  1. LOCAL_PATH := $(call my-dir)  
  2.   
  3. include $(CLEAR_VARS)  
  4.   
  5. LOCAL_MODULE    := hello-jni  
  6. LOCAL_SRC_FILES := hello-jni.c  
  7.   
  8. include $(BUILD_SHARED_LIBRARY)  

-- LOCAL_PATH :
代表mk文件所在的目录;

-- include $(CLEAR_VARS) : 编译工具函数, 通过该函数可以进行一些初始化操作;

-- LOCAL_MODULE : 编译后的 .so 后缀文件叫什么名字;

-- LOCAL_SRC_FILES: 指定编译的源文件名称;

-- include $(BUILD_SHARED_LIBRARY) : 告诉编译器需要生成动态库;

e. NDK编译生成动态库 : 

进入 cygdrive 找到windows目录下对应的文件, 编译完成之后, 会自动生成so文件并放在libs目录下, 之后就可以在Java中调用C语言方法了;

f. Java中加载动态库 : 

在Java类中的静态代码块中使用System.LoadLibrary()方法加载编译好的 .so 动态库;

NDK平台版本 : NDK脚本随着 android-sdk 版本不同, 执行的脚本也是不同的, 不同平台会引用不同的头文件, 编译的时候一定注意 sdk 与 ndk 版本要一致;

so文件在内存中位置 : apk文件安装到手机上之后, .so动态库文件存在在 data/安装目录/libs 目录下;

时间: 2024-12-02 15:40:12

Android 开发 NDK从入门到精通的相关文章

android开发布局从入门到精通

Android的UI组件都是继承View类,View表示一个空白的矩形区域.TextView.Button.EditText这些常用的组件等都是直接或间接继承自View. 此外,View还有一个重要的子类ViewGroup,该类可以用来包含多个View组件,本身也可以当做一个View组件被其他的ViewGroup所包含,由此,可以构建出非常复杂的UI界面. 常用的布局管理器如FrameLayout.LinearLayout.RelativeLayout等都直接继承自ViewGroup. 在And

Android 开发 之 JNI入门 - NDK从入门到精通

NDK项目源码地址 :  -- 第一个JNI示例程序下载 : GitHub - https://github.com/han1202012/NDKHelloworld.git  -- Java传递参数给C语言实例程序 : GitHub - https://github.com/han1202012/NDKParameterPassing.git  --C语言回调Java方法示例程序 : GitHub - https://github.com/han1202012/NDK_Callback.git

Android OpenGL ES 开发教程 从入门到精通

From:http://blog.csdn.net/mapdigit/article/details/7526556 Android OpenGL ES 简明开发教程 Android OpenGL ES 简明开发教程一:概述 Android OpenGL ES 简明开发教程二:构造OpenGL ES View Android OpenGL ES 简明开发教程三:3D绘图基本概念 Android OpenGL ES 简明开发教程四:3D 坐标变换 Android OpenGL ES 简明开发教程五

【Android开发】JSON入门

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等).这些特性使JSON成为理想的数据交换语言.易于人阅读和编写,同时也易于机器解析和生成. JSON 语法

Android 开发Missing contentDescription attribute on image in XML

最近在做 Android 开发,刚刚入门,遇到不少问题,累积了做重构时的习惯,遇到问题,好好解决,好好总结,于是整理如下: 一. Eclipse Error1.'Missing contentDescription attribute on image' in XML原因:缺少图片描述,在 ADT 16 开始会抛出这个警告,确保开发者为图片添加内容描述. 解决方法:为图片添加 android:contentDescription="@string/desc" 属性. 2. Button

《Android应用开发从入门到精通》——第1章,第1.2节Android架构解析

1.2 Android架构解析 Android应用开发从入门到精通 Android系统的底层建立在Linux系统之上,该平台采用一种称为软件叠层(Software Stack)的方式进行构建.这种软件叠层结构使得层与层之间相互分离,明确各层的分工.这种分工是软件工程中常说的低耦合高内聚的设计概念. 1.2.1 Android系统架构图 Android作为一个移动设备的平台,其软件层次结构包括了内核层.中间件和应用程序.下面看看Android的系统架构图,如图1.2所示. 如图1.2所示,Andr

《Android应用开发从入门到精通》——第2章,第2.1节开发准备工作

2.1 开发准备工作 Android应用开发从入门到精通 下面来了解一下开发Android程序需要哪些工具. 1.Java JDK JDK(Java Development Kit)是Sun Microsystems针对Java开发员的产品.JDK是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment).Java工具和Java基础的类库. 2.Android SDK Android SDK是谷歌提供的Android开发工具包,在开发Android程序时,需要

《Android应用开发从入门到精通》——第2章,第2.2节开发环境搭建

2.2 开发环境搭建 Android应用开发从入门到精通 Java SDK安装,本书选择Java SDK 1.7,下载地址:http://www.oracle.com/technetwork/java/javase/ downloads/index.html 环境变量配置如下. 需要将JDK安装文件夹下的bin和lib子文件夹路径添加到系统的路径环境变量"PATH"中. 创建"JAVA_HOME"环境变量,并将JDK的安装文件夹设置给该变量. 这样就剩下SDK.ec

《Android应用开发从入门到精通》——第2章,第2.5节小结

2.5 小结 Android应用开发从入门到精通 本章初步了解了Android应用开发过程,从搭建系统环境.安装平台SDK.安装IDE和如何使用调试工具,到创建了第一个Android项目,并对Android项目的目录结构和运行流程有了一定的认识,相信在这个过程中会有所收获,若有疑问咱们一起在下面的章节中寻找答案.