Android NDK 的结构: ndk-build :该shell脚本是NDK构建系统的起始点。
ndk-gdb:该shell脚本允许用gnu调试器调试原生组件 Android NDK构建系统是由多种GNU
Makefile片段构成的。这些关键Makefile片段在NDK 安装目录的 build/core子目录中找到
这些脚本可以帮助我们更系统的了解构建过程APP_CONLYFLAGS 单独设置C代码的编译选项,例如-std=c99 若使用APP_CFLAGS
则会传递给C++代码的编译选项,造成 cc1plus.exe: warning: command line option
‘-std=c99’ is valid for C/ObjC but not for C++ 的警告Android.mk 是一个向Android NDK构建系统描述NDK项目的GNU Makefile片段。他是每一个NDK项目的必备组件。
Android.mk
# Copyright (C) 2009 The Android Open Source Project # #号代表此行为注释行
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
LOCAL_PATH := $(call my-dir) # Android.mk文档必须以LOCAL_PATH变量的定义开头 Android构建系统利用LOCAL_PATH来定位源文件。
include $(CLEAR_VARS) #清除除LOCAL_PATH以外的LOCAL_<name>变量,例如LOCAL_SRC_FILES等
LOCAL_MODULE := hello-jni #LOCAL_MODULE变量用来给这个模块设定唯一的名称
LOCAL_SRC_FILES := hello-jni.c #定义用来建立和组装这个模块的源文件列表 可以包含多个源文件名
include $(BUILD_SHARED_LIBRARY) # 构建共享库
1、构建静态库
include $(BUILD_STATIC_LIBRARY)
使用静态库
LOCAL_STATIC_LIBRARIES :=myStaticLib
2、同时使用静态库和共享库
3、用共享库共享通用模块。
若用静态库作为通用模块,则程序中含有多个静态库的副本,导致增加了应用程序大小
4、预构建共享模块
LOCAL_PATH :=$(call my-dir)
#
预构建库
#
include $(CLEAR_VARS)
LOCAL_MODULE := myLib
LOCAL_SRC_FILES := libmyLib.so
include $(PREBUILT_SHARED_LIBRARY)
使用预构建库
…
LOCAL_SHARED_LIBRARIES := mylib
…
5、构建独立的可执行文件
include $(BUILD_EXECUTABLE)
6、其他构建系统变量
LOCAL_CPP_FEATURES := rtti #具体C++特性
LOCAL_C_INCLUDES :=$(LOCAL_PATH)/include #用来搜索头文件目录
LOCAL_CFLAGS := -DANDROID #在编译 C和C++源文件时会被传送给编译器
LOCAL_CPP_FLAGS #只在编译C++源文件时被传送给编译器
Application.mk 是NDK构建的一个可选构建文件,它的目的是描述应用程序需要哪些模块;它也定义所有模块的通用变量。
APP_OPTIM:该变量被设置为release和debug 默认release
APP_CFLAGS:在编译任何模块的C和C++源文件时这些标志都会被传递给编译器
APP_CPPFLAGS:在编译任何模块的C++源文件时这些标志都会被传递给编译器
APP_STL :选择不同的STL实现
7、使用NDK-BUILD脚本
ndk-build -B # 强制重构建所有源代码
LOCAL_ARM_MODE: 默认情况下, arm目标二进制会以 thumb 的形式生成(16 位),你可以通过设置这个变量为 arm如果你希望你的 module 是以 32 位指令的形式。
‘arm’ (32-bit instructions) mode. E.g.:
LOCAL_ARM_MODE := arm
注意:可以在编译的时候告诉系统针对某个源码文件进行特定的类型的编译
比如,LOCAL_SRC_FILES := foo.c bar.c.arm 这样就告诉系统总是将 bar.c 以arm的模式编译。