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

0 0
原创粉丝点击