Android.mk

Android.mk把你的源码组织成“模块”(静态库/动态库)。默认情况会读取project/jni/Android.mk,并会读取project/jni/Application.mk作为可选选项。

你可以在单个Android.mk文件中定义多个模块,或者你可以书写多个Android.mk文件,每个文件定义一个单一模块。

如果你想在子目录中定义Android.mk文件 include $(call all-subdir-makefiles)。

注意,一个Android.mk文件可能被构建系统分析多遍,所以不要假设某个变量没有被定义。默认下,NDK将寻找下面的构建脚本:

$PROJECT/jni/Android.mk

如果你想在子路径下定义Android.mk文件,你应该在顶层的Android.mk中包含它们。有个函数可以做到这个功能:

include$(call all-subdir-makefiles)

这将会包含当前构建路径的所有子路径下的Android.mk文件们。

Application.mk

这个文件主要包含:

你的应用所需要模块的准确列表。

产生的机器码所对应的CPU架构。

可选的信息,像你要构建release还是debug,特殊的C或 C++编译参数以及其它需要应用到所有模块的构建选项。

这个文件是可选的:默认情况下,NDK将构建在Android.mk中列出的所有模块的并且默认面向CPUABI (armeabi).

将它放在$PROJECT/jni/Application.mk位置,那么它会被’ndk-build’脚本自动使用。

Application.mk

它描述哪个原声模块是我的应用程序所需要的。例如描述添加STL的支持APP_STL := stlport_static。

它部分的变量:

APP_PROJECT_PATH # 应用程序工程根目录的绝对路径

APP_MODULES # 应用程序工程用到的模块

APP_OPTIM # 优化级别release或者debug

APP_CFLAGS # C编译器开关集合

APP_CPPFLAGS # C++编译器开关集合

APP_BUILD_SCRIPT # NDK构建系统脚本即Android.mk位置

APP_ABI := armeabi armeabi-v7a # 为了支持基于ARMv5TE和ARMv7设备的软件浮点单元指令

APP_STL := system # 默认的C++运行时库

APP_STL := stlport_shared # 动态STLport库

APP_STL := stlport_static # 静态STLport库

这里的APP_OPTIM := debug和ndk-build NDK_DEBUG=1是等效的,

APP_OPTIM := release和NDK_DEBUG=0是等效的。

ndk-build组件

它是个很小的脚本在目录NDK_ROOT/ndk-build下,用于构建NDK库。用法很简单

cd

/ndk-build # 如果将ndk_root配置到环境变量就直接使用ndk-build

它将中间文件生成到obj/下,目标文件生成到libs/下。

ndk-build # 编译

ndk-build clean # 清掉二进制文件

ndk-build NDK_DEBUG=1 # 编译为可调试版的二进制文件

ndk-build NDK_DEBUG=0 # 编译为release版

ndk-build V=1 # 执行ndk-build且打印出它所执行的详细编译命令。

ndk-build -B # 强制重新编译

ndk-build -B V=1 # -B 和 V=1 的组合

ndk-build NDK_LOG=1 # 打印出内部的NDK日志信息(用于调试NDK自己)

ndk-build NDK_APP_APPLICATION_MK= # 用这里指定的路径寻找Application.mk文件

ndk-build -C # 先cd进入,然后执行ndk-build

ndk-gdb组件

使用NDK/ndk-gdb启用native调试(ndk-build时要家参数NDK_DEBUG=1)

ndk-build NDK_DEBUG=1 # 带调试信息编译

ant debug && adb install -r bin/xxx.apk # 打包和安装

ndk-gdb --start # 启动调试信息

附:

使用命令行创建项目

SDK根目录下执行 tools/android list targets

执行创建命令:

android create project --target --name MyFirstApp --path /MyFirstApp --activity MyActivity --package com.example.myfirstapp

# 为第一步里展示的。

使用ant命令行打包

首先确保安装了ANT到环境,加入ANT_ROOT/bin到环境变量

android update project --name --target --path

# 这样就会产生build.xml, local.properties两文件。

# 如果添加了第三方包,需要添加--subprojects参数

ant debug # 打包一个测试apk 默认使用debug key签名

ant release # 生成一个未签名和未aligned的apk(工程添加签名规则后会生成已签名apk)

adb install -r ./bin/XXX.apk # adb 安装

android jni 机器码,NDK构建相关推荐

  1. Android JNI 和 NDK

    1.Android NDK 一.NDK产生的背景 Android平台从诞生起,就已经支持C.C++开发.众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第 ...

  2. Connor学Android - JNI和NDK编程

    Learn && Live 虚度年华浮萍于世,勤学善思至死不渝 前言 Hey,欢迎阅读Connor学Android系列,这个系列记录了我的Android原理知识学习.复盘过程,欢迎各位 ...

  3. Android jni开发--NDK环境搭建

    谷歌改良了ndk的开发流程,对于Windows环境下NDK的开发,如果使用的NDK是r7之前的版本,必须要安装Cygwin才能使用NDK.而在NDKr7开始,Google的Windows版的NDK提供 ...

  4. Android JNI(一)——NDK与JNI基础

    前言 ndk开发是高级Android 开发必备的技能,也是很多Android开发工程师难以逾越的门槛,因此,学习ndk开发已经是高级Android必备技能,所以我尝试把自己ndk开发经验记录下来,不知 ...

  5. Android JNI和NDK学习(5)--JNI分析API

    Java类型和本地类型对应 在如下情况下,需要在本地方法中应用java对象的引用,就会用到类型之间的转换: java方法里面将参数传入本地方法: 在本地方法里面创建java对象: 在本地方法里面ret ...

  6. Android JNI学习(六)——Java与Native实战演习

    前言: 前几篇我主要介绍了jni先关的基础知识和常用API,相信看过的童靴对JNI已经有了一定的了解,如果不了解也没关系,下面我给出了链接,可以点进去学习.接下来我将实战一个完整案例,案例很简单,就是 ...

  7. Android JNI学习(五)——Java与Native之间如何实现相互调用

    本章将讲述Java与Native之间如何实现相互调用.我将围绕围绕如下三点来讲解. #mermaid-svg-qeVnGlVrLWrB5ryX .label{font-family:'trebuche ...

  8. Android JNI学习(四)——JNI的常用方法的API

    前三篇主要讲解了jni基础相关的理论知识,今天主要讲解一下JNI的常用方法的API,掌握了基本的理论知识和常用的API接下来才能更好的实战. jni的常用API大纲 再看API前,我建议大家主要结合官 ...

  9. Android JNI(三)——JNI数据结构之JNINativeMethod

    上俩篇,我们讲了都是jni基础的原理知识以及如何使用cmake实现简单的jni.接下来本想讲解Java与Native相互调用的,但是发现Java与Native相互调用中设计了好多基础知识,其中用的比较 ...

最新文章

  1. Swift学习 OOP三大特性:继承、多态、封装
  2. Input.GetAxis
  3. PAT甲级1119 Pre- and Post-order Traversals (30分):[C++题解]暴搜dfs、前序遍历和后序遍历求中序遍历
  4. linux 垃圾桶快捷键,Linux的基本:为网上邻居配个垃圾桶
  5. storm后台启动命令(避免新开窗口)
  6. JQuery中一些常用函数的运用
  7. Linux系统开发9 线程同步
  8. 一边撸猫一边写代码,Linus Torvalds 谈在家办公
  9. struts中action名称反复导致的神秘事件
  10. php pdf转为jpg 插件,php使用Image Magick将PDF文件转换为JPG文件的方法
  11. informix软件
  12. c语言怎么让程序停止3秒,求助!!!!用单片机的定时器T1怎么写一个LED亮2秒灭3秒的程序 C语言...
  13. 克隆Linux虚拟机
  14. 1000:有一分数序列: 2/1 3/2 5/3 8/5 13/8 21/13...... 求出这个数列的前N项之和,保留两位小数:
  15. ASEMI代理AD9833BRMZ-REEL原装ADI车规级AD9833BRMZ-REEL
  16. 终结吧!机器学习的数学焦虑_机器人来了!
  17. 5G驻留比提升经验总结
  18. 栈(stack)——什么是栈?
  19. MATLAB如何计算函数导数
  20. [数据统计]百度在调低索引库的容量

热门文章

  1. C# 窗口大小及屏幕分辨率操作
  2. 中流科技联手RedHat建立开放SOA解决方案中心
  3. MySQL如何访问Postgres
  4. 企业运维经典面试题汇总(3)
  5. 非法关机的时候,postgresql启动故障的解决
  6. Linux修改时区(tzselect) 【例子:修改时区 为 中国 东8区 的时间】
  7. 【Linux】TOP命令
  8. Git Your branch is ahead of ‘origin/master‘ by X commits解决方法
  9. 跨域的另一种解决方案——CORS(Cross-Origin Resource Sharing)跨域资源共享
  10. Visual Studio 2015出现Cannot find one or more components. Please reinstall the application.的问题解决