android_c++ 高级编程NDK学习笔记一
来源:互联网 发布:80端口攻击工具 编辑:程序博客网 时间:2024/06/10 01:55
深入了解android NDK
2.1 Android 提供的组件:
ARM,x86和MIPS交驻编译器
构建系统
Java原生接口头文件
C库
Math库
POSIX线程
最小的c++库
ZLIB压缩库
动态链接库
Android日志库
Android像素缓冲库
Android 原生应用apis
OpenGL ES 3D 图形库
openSL ES 原生音频库
openMAX AL最小支持
2.2 android NDK的目录结构
名称
介绍
Ndk-build
Shell角本,构建系统的起始点
Ndk-gdb
Shell角本,GNU调试器原生组件
Ndk-stack
Shell角本,用于分析原生组件崩溃时的堆栈追踪
build
目录,包含了构建系统的所有模块
platforms
目录,支持不同android目标版本的头文件和库文件
simple
示例应用
source
可导入的共享模块
toolchains
不同版本的交叉编译器
2.3 简单的示例程序
配置eclipse,windows-àpreference-àandroid-àNDK,指定ndk的目录
导入ndk自带示例程序
向项目中添加原生支持右击项目àandroidTools-àadd Native Support,指定共享库名
运行项目
可以在控制台看到构建信息
13:08:35 **** Incremental Build ofconfiguration Default for project HelloJni ****
"D:\\tools\\android-ndk-r9b\\ndk-build.cmd"all
[armeabi] Gdbserver : [arm-linux-androideabi-4.6]libs/armeabi/gdbserver
[armeabi] Gdbsetup : libs/armeabi/gdb.setup
[armeabi] Install : libhello-jni.so =>libs/armeabi/libhello-jni.so
13:08:36 Build Finished (took 388ms)
用命令行对项目进行构建
A 构建原生组件
D:\workspace4>cdhello-jni
D:\workspace4\hello-jni>ls
AndroidManifest.xml default.properties jni res src tests
D:\workspace4\hello-jni>ndk-build
[armeabi] Gdbserver :[arm-linux-androideabi-4.6] libs/armeabi/gdbserver
[armeabi] Gdbsetup :libs/armeabi/gdb.setup
[armeabi] Compile thumb :hello-jni <= hello-jni.c
[armeabi] SharedLibrary :libhello-jni.so
[armeabi] Install :libhello-jni.so => libs/armeabi/libhello-jni.so
D:\workspace4\hello-jni>ls
AndroidManifest.xml default.properties jni libs obj res src tests
B 构建java应用程序,并将其与原生组件打包
生成apach ANT构建文件
D:\workspace4\hello-jni>android update project -p . -nhello-jni -t android-14 -
-subprojects
Updated and renamed default.properties to project.properties
Updated local.properties
Added file D:\workspace4\hello-jni\build.xml
Added file D:\workspace4\hello-jni\proguard-project.txt
Updated and renamed default.properties to project.properties
Updated local.properties
Added file D:\workspace4\hello-jni\tests\build.xml
Added file D:\workspace4\hello-jni\tests\proguard-project.txt
D:\workspace4\hello-jni>ls
AndroidManifest.xml jni local.properties proguard-project.txt res tests
build.xml libs obj project.properties src
执行ant debug构建并生成apk包
在项目的目录结构中
jni
原生组件源代码,描述原生组件方法的android.mk
libs
构建过程中创建该目录
obj
编译源代码后产生的目标文件都放在该目录
2.4 构建环境
构建系统的片段位于build/core子目录中
Android.mk位于jni子目录中
示例代码如下
LOCAL_PATH := $(callmy-dir) //定位源文件,my-dir是一个宏
include $(CLEAR_VARS) //clear_vars.mk 擦除local_path以外的local_*
LOCAL_MODULE := hello-jni //定义模块名称 生成libhello-jni.so
LOCAL_SRC_FILES :=hello-jni.c //源文件列表
include$(BUILD_SHARED_LIBRARY) //成生共享库
@@@@@@构建多个共享库,示例代码如下:@@@@@@@@@@
LOCAL_PATH := $(call my-dir)
#模块一
include $(CLEAR_VARS)
LOCAL_MODULE := modul1
LOCAL_SRC_FILES := modul1.c
include $(BUILD_SHARED_LIBRARY)
#模块二
include $(CLEAR_VARS)
LOCAL_MODULE := modul2
LOCAL_SRC_FILES := modul2.c
include $(BUILD_SHARED_LIBRARY)
@@@@@@@@构建静态库(使用第三方源代码)@@@@@@@@@
LOCAL_PATH=$(cal l my-dir)
#第三方avi库
Include $(CLEAR_VARS)
LOCAL_MODULE :=avilib
LOCAL_SRC_FILES :=avilib.c,platform_posix.c
Include $(BUILD_STATIC_LIBRARY)
#原生模块
include $(CLEAR_VARS)
LOCAL_MODULE := modul
LOCAL_SRC_FILES := modul.c
LOCAL_STATIC_LIBRARIES :=avilib //定义变量,使用该模块
include $(BUILD_SHARED_LIBRARY)
@@@@@用共享库,共享通用模块(即多个模块使用同一第一方源代码)@@@@@@@
LOCAL_PATH=$(cal l my-dir)
#第三方avi库
Include $(CLEAR_VARS)
LOCAL_MODULE :=avilib
LOCAL_SRC_FILES :=avilib.c,platform_posix.c
Include $(BUILD_SHARED_LIBRARY)
#原生模块一
include $(CLEAR_VARS)
LOCAL_MODULE := modul1
LOCAL_SRC_FILES := modul1.c
LOCAL_SHARED_LIBRARIES :=avilib //
include $(BUILD_SHARED_LIBRARY)
#原生模块二
include $(CLEAR_VARS)
LOCAL_MODULE := modul2
LOCAL_SRC_FILES := modu2l.c
LOCAL_SHARED_LIBRARIES :=avilib //
include $(BUILD_SHARED_LIBRARY)
@@@@@@@@@@@@@在多个NDK项目中共享模块@@@@@@@@@@@@@@
#原生模块
include $(CLEAR_VARS)
LOCAL_MODULE := modul
LOCAL_SRC_FILES := modul.c
LOCAL_STATIC_LIBRARIES :=avilib
include $(BUILD_SHARED_LIBRARY)
$calll (import_module,**/***) //指定路径名,可以在一环境变量中定义一个共享模块路径(所以***/***可以是一个相对路径)
@@@@@@@@@@@使用prebuilt库@@@@@@@@@@@@@@@@
应用场景: A 在不发布源代码的情况下将你的模块发布给他人
B 想使用共享模块的预见版来加速构建过程
注:prebuilt库中不包含机器体系结构的信息
示例代码如下:
#第三方avi库
Include $(CLEAR_VARS)
LOCAL_MODULE :=avilib
LOCAL_SRC_FILES :=libavilib.so//需要将该库复制到libs目录下
Include $(PREBUILT_STATIC_LIBRARY)
#原生模块一
include $(CLEAR_VARS)
LOCAL_MODULE := modul
LOCAL_SRC_FILES := modul.c
LOCAL_SHARED_LIBRARIES :=avilib //
include $(BUILD_SHARED_LIBRARY)
@@@@@@@@@@@@构建独立的可执行文件@@@@@@@@@@@@@@@@@@
…
include $(BUILD_EXECUTABLE)
…
会生成android设备上的常规linux应用程序,可以直接执行
@@@@@@@@@@@@其他构建系统变量@@@@@@@@@@@@@@@@@@@
变量名
用途
TARGET_ARCH
目标CPU体系名称
TARGET_PLATFORM
Android平台的名称
TARGET_ARCH_ABI
目标CPU体系名称和ABI的名称
LOCAL_MODULE_FILENAME
重新定义生成输出文件的名称
LOCAL_CPP_EXTENSION
可以为c++源文件提供一个或多个扩展名
LOCAL_CPP_FEATURES
模块所依赖的c++的特性
LOCAL_C_INCLUDES
NDK安装目录的相对路径,用来搜索头文件
LOCAL_CFLAGS
编译器标志
LOCAL_CPPFLAGS
编译器标志
LOCAL_LDLIBS
目标文件进行链接时所需标志
LOCAL_ALLOW_UNDEFINED
_SYMBOLS
禁止在生成文件中进行缺失符检查
LOCAL_ARM_MODE
生成ARM二进制类型
LOCAL_ARM_NEON
指定高给单指令流和多数据流内联函数
LOCAL_DISABLE_NO_EXECUTE
禁用nx bit安全特性
LOCAL_EXPORT_CFLAGS
编译标志
LOCAL_EXPORT_CPPFLAGS
编译标志
LOCAL_EXPORT_LDFLAGS
链接器标志
LOCAL_EXPORT_C_INCLUDES
允许记录路径集
LOCAL_SHORT_COMMANDS
对于有大量资源/独立静态库/共享库,应设为true
LOCAL_FLITER_ASM
过虑来自 local_src_files变量的装配文件
@@@@@@@@@@@@@其他的构建系统宏函数@@@@@@@@@@@@@@@@@
All_subdir_makefiles
返回当前目录下的所有子目录下的android.mk构建文件列表
This_makefile
返回当前android.mk的路径
Parent_makefile
父android.mk路径
Grand_parent_makefile
祖父目录
@@@@@@@@@@@@@@@@定义新变量@@@@@@@@@@@@@@@@@@
变量名:=值
使用时: $(变量名)
@@@@@@@@@@@@@@条件操作@@@@@@@@@@@@@@@@@@@@@@@
Ifeq
…
Else
…
Endif
Application.mk
是一个可选构建文件,应用程序需要哪些模块
APP_MODULES
声明所有模块
APP_OPTIM
Release/debug改变生成二进制文件的优先级
APP_CFLAGS
编 译器标志
APP_CPPFLAGS
编译器标志
APP_BUILD_SCRIPT
在不同目录(非jni目录)下查找构建文件
APP_ABI
构建系统为armeabi ABI生成二进制文件
APP_STL
使用最小的STL运行库
APP_GNUSTL_FORCE
_CPP_FEATURES
依赖c++特性
APP_SHORT_COMMANDS
可以在项目中使用更短的命令
2.5 使用NDK-Build角本
Ndk-build参数名称 项目名称
参数:
-C 指定项目路径
-B 重新构建目标
-j 指定并行执行数量(GNU make可以并行执行构建命令)
2.6 排除构建系统故障
开启日志 ndk-build NDK_LOG=1
只显示构建命令ndk-build V=1
- android_c++ 高级编程NDK学习笔记一
- android_c++ 高级编程NDK学习笔记二
- android_c++ 高级编程NDK学习笔记三
- android_c++ 高级编程NDK学习笔记四
- android_c++ 高级编程NDK学习笔记四
- android_c++ 高级编程NDK学习笔记五
- Oracle专家高级编程学习笔记(一)
- Oracle专家高级编程学习笔记(一)
- Web服务高级编程学习笔记(一)
- Windows高级编程学习笔记(一)
- Android NDK 学习笔记(一)
- NDK学习笔记(一)
- Unix 环境高级编程学习笔记(一)
- Unix环境高级编程学习笔记(一) 初窥
- Unix 环境高级编程学习笔记(一)
- 《UNIX环境高级编程》学习笔记一之进程环境
- 【linux高级环境编程学习笔记一】管道通信
- 高级编程学习笔记(一) malloc的分配方法
- python基础教程学习笔记一
- MATLAB图像处理与计算机视觉(3):实现Carsten Steger 的曲线检测算法(1)
- shell脚本中的一些特殊符号
- 用symbolicatecrash工具分析iOS Crash文件
- 16、Cocos2dx 3.0游戏开发找小三之Node:父节点、子节点、傻傻分不清楚
- android_c++ 高级编程NDK学习笔记一
- pythonlibs
- Mapreduce常见数据挖掘算法集收集
- 黑马程序员---面向对象I--
- 数据库的一般操作
- 黑马程序员-习题练习1
- Android系统实现横竖屏两方向自动旋转的方法
- 【Android开发那点破事】消息推送BroadcastReceiver,点击通知打开两次Activity问题
- JavaSE、JavaEE、JavaME三者的关系与区别