Android studio2.3 CMake新建工程的日志打印

本文转自

期待已久的android studio 2.3正式版本终于发布了,该版本开始开发 NDK 便简单了很多,比起使用 javac、javah 命令才能完成的方式简直是质的提升

下载 NDK 和构建工具


要为您的应用编译和调试原生代码,您需要以下组件:

  • Android 原生开发工具包 (NDK):这套工具集允许您为 Android 使用 C 和 C++ 代码,并提供众多平台库,让您可以管理原生 Activity 和访问物理设备组件,例如传感器和触摸输入。

  • CMake:一款外部构建工具,可与 Gradle 搭配使用来构建原生库。如果您只计划使用 ndk-build,则不需要此组件。

  • LLDB:一种调试程序,Android Studio 使用它来调试原生代码。

您可以使用 SDK 管理器安装这些组件:

  1. 在打开的项目中,从菜单栏选择 Tools > Android > SDK Manager。

  2. 点击 SDK Tools 标签。

  3. 选中 LLDB、CMake 和 NDK 旁的复选框,如图 所示。

  • CMake: Android Studio 默认使用 CMake 编译原生库,如果你只打算用ndk-build来编译的话,你就不需要这个组件。

  • LLDB: 使用它来调试本地代码。

  • 点击 Apply,然后在弹出式对话框中点击 OK。

  • 安装完成后,点击 Finish,然后点击 OK。

NDK开发-之1——as2.3中新建工程自定义方法及日志打印

===========

创建支持 C/C++ 的新项目


创建支持原生代码的项目与创建任何其他 Android Studio 项目类似,不过前者还需要额外几个步骤:

  1. 在向导的 Configure your new project 部分,选中 Include C++ Support 复选框。

NDK开发-之1——as2.3中新建工程自定义方法及日志打印

打勾哦

  1. 点击 Next。

  2. 在向导的 Customize C++ Support 部分,您可以使用下列选项自定义项目:

  • C++ Standard:使用下拉列表选择您希望使用哪种 C++ 标准。选择 Toolchain Default 会使用默认的 CMake 设置。

  • Exceptions Support:如果您希望启用对 C++ 异常处理的支持,请选中此复选框。如果启用此复选框,Android Studio 会将 -fexceptions 标志添加到模块级 build.gradle 文件的 cppFlags 中,Gradle 会将其传递到 CMake。

  • Runtime Type Information Support:如果您希望支持 RTTI,请选中此复选框。如果启用此复选框,Android Studio 会将 -frtti 标志添加到模块级build.gradle 文件的 cppFlags 中,Gradle 会将其传递到 CMake。

NDK开发-之1——as2.3中新建工程自定义方法及日志打印

  1. 点击 Finish。

在 Android Studio 完成新项目的创建后,请从 IDE 左侧打开 Project 窗格并选择 Android 视图。如图 2 中所示,Android Studio 将添加 cpp 和 External Build Files 组:

NDK开发-之1——as2.3中新建工程自定义方法及日志打印

查看不同普通项目的结构

您的原生源文件和外部构建脚本的 Android 视图组。

注:此视图无法反映磁盘上的实际文件层次结构,而是将相似文件分到一组中,简化项目导航。

  1. 在 cpp 组中,您可以找到属于项目的所有原生源文件、标头和预构建库。对于新项目,Android Studio 会创建一个示例 C++ 源文件 native-lib.cpp,并将其置于应用模块的 src/main/cpp/ 目录中。本示例代码提供了一个简单的 C++ 函数 stringFromJNI(),此函数可以返回字符串“Hello from C++”。

NDK开发-之1——as2.3中新建工程自定义方法及日志打印

as生成自动生成的代码

  1. 在 External Build Files 组中,您可以找到 CMake 或 ndk-build 的构建脚本。与 build.gradle 文件指示 Gradle 如何构建应用一样,CMake 和 ndk-build 需要一个构建脚本来了解如何构建您的原生库。对于新项目,Android Studio 会创建一个 CMake 构建脚本 CMakeLists.txt,并将其置于模块的根目录中。要详细了解此构建脚本的内容,请参阅介绍如何创建 Cmake 构建脚本的部分。

NDK开发-之1——as2.3中新建工程自定义方法及日志打印

构建和运行示例应用

点击 Run

后,Android Studio 将在您的 Android 设备或者模拟器上构建并启动一个显示文字“Hello from C++”的应用。下面的概览介绍了构建和运行示例应用时会发生的事件:

  1. Gradle 调用您的外部构建脚本 CMakeLists.txt。

  2. CMake 按照构建脚本中的命令将 C++ 源文件 native-lib.cpp 编译到共享的对象库中,并命名为 libnative-lib.so,Gradle 随后会将其封装到 APK 中。

  3. 运行时,应用的 MainActivity 会使用 System.loadLibrary() 加载原生库。现在,应用可以使用库的原生函数 stringFromJNI()。

  4. MainActivity.onCreate() 调用 stringFromJNI(),这将返回“Hello from C++”并使用这些文字更新 TextView。

注:Instant Run 与使用原生代码的项目不兼容。Android Studio 会自动停用此功能。

NDK开发-之1——as2.3中新建工程自定义方法及日志打印

如果您想要验证 Gradle 是否已将原生库封装到 APK 中,可以使用 APK 分析器:

  1. 选择 Build > Analyze APK。

NDK开发-之1——as2.3中新建工程自定义方法及日志打印

  1. 从 app/build/outputs/apk/ 目录中选择 APK 并点击 OK。

  2. 如图 3 中所示,您会在 APK 分析器窗口的 lib/<ABI>/ 下看到 libnative-lib.so。

NDK开发-之1——as2.3中新建工程自定义方法及日志打印

由于之前对这些目录不太熟悉,通过网络恶补一下知识,这里各种类型的cpu进行简单说明:(其实我们关心的是我们目标机型可能用到的cpu即可,比较常用的是arm,这些说明都来自与网络搜索)

mips架构和arm架构:这两个都是小型设备的处理器架构。MIPS架构的处理器多用在网关、猫、机顶盒什么的。ARM处理器用在便携设备,智能手机。这两个东西的市场几乎很少重叠,因此也谈不上对比。 普通用户关注MIPS主要还是因为我国所谓的”龙芯“。

mips64:64位cpu。64为的mips

mips:32位cpu。MIPS是世界上很流行的一种RISC处理器。MIPS的意思“无内部互锁流水级的微处理器”(Microprocessor without interlocked piped stages)

arm64-v8a:是64位CPU 版本是v8a

x86_64:64位cpu。X86-64可在同一时间内处理64位的整数运算,并兼容X86-32架构。

x86::32位cpu。x86架构是 复杂指令集计算机,Complex Instruction Set Computer的 简称。 x86架构于1978年推出的Intel8086中央处理器中首度出现,它是从Intel8008处理器中发展而来的,而8008则是发展自Intel4004的。8086在三年后为IBM PC所选用,之后x86便成为了个人计算机的标准平台,成为了历来最成功的CPU架构。我们现在个人计算机中最常见的intel、amd的各类cpu,都属于X86指令架构。指支持x86指令集,寻址位宽为64bit的操作系统和硬件,在我们计算机中最明显的体现是支持内存容量大于3.3G以上

armeabi:32位cpu。 armeabi和armeabi-v7a是表示32位cpu的类型。 4、不同点 因此armeabi通用性强,但速度慢,而v7a能充分发挥v7a CPU的能力。

armeabi-v7a:32位cpu,版本号v7a

=====================

在添加一个自己需要的方法

NDK开发-之1——as2.3中新建工程自定义方法及日志打印

as自动帮我生存了框架,加上我自己的业务逻辑代码

NDK开发-之1——as2.3中新建工程自定义方法及日志打印

在Activity对应的试图上添加一个用于显示相加结果的值

NDK开发-之1——as2.3中新建工程自定义方法及日志打印

NDK开发-之1——as2.3中新建工程自定义方法及日志打印

运行错误日志:

NDK开发-之1——as2.3中新建工程自定义方法及日志打印

最后解决办法,原始android studio2.3对自动生产ndk对应的代码还不是很智能

如果要在native-lib.cpp文件中添加多少方法,必须添加在 extern “c” { } 中,或者在每个方法前加 extern “c” , 否则会报找不到方法!

配置后,默认的是C++的,如要改成C语言后缀的,直接把native-lib.cpp,改在C,并去掉 extern “c”,

在CMakeLists.txt文件中native-lib.cpp也修改后缀名!

NDK开发-之1——as2.3中新建工程自定义方法及日志打印

NDK开发-之1——as2.3中新建工程自定义方法及日志打印

再次运行 ok

NDK开发-之1——as2.3中新建工程自定义方法及日志打印

=====================

NDK层日志打印

google 为android 提供了大量官方例子,其中ndk开发部分在:

https://github.com/googlesamples/android-ndk

Android NDK 提供了一套实用的原生 API 和库。

添加 NDK API

Android NDK 提供了一套实用的原生 API 和库。通过将 NDK 库包含到项目的 CMakeLists.txt 脚本文件中,您可以使用这些 API 中的任意一种。

预构建的 NDK 库已经存在于 Android 平台上,因此,您无需再构建或将其封装到 APK 中。由于 NDK 库已经是 CMake 搜索路径的一部分,您甚至不需要在您的本地 NDK 安装中指定库的位置 – 只需要向 CMake 提供您希望使用的库的名称,并将其关联到您自己的原生库。

将 find_library() 命令添加到您的 CMake 构建脚本中以定位 NDK 库,并将其路径存储为一个变量。您可以使用此变量在构建脚本的其他部分引用 NDK 库。以下示例可以定位 Android 特定的日志支持库并将其路径存储在 log-lib 中:

为了打印日志,这里涉及到需要引用系统的基础库

比如我的路径是在:E:\android\adt-bundle-windows-x86_64-20140702\sdk\ndk-bundle\platforms\android-19\arch-arm\usr

(这里android-19这一级目录表示支持不同android版本的定义)

NDK开发-之1——as2.3中新建工程自定义方法及日志打印

进入到

NDK开发-之1——as2.3中新建工程自定义方法及日志打印

NDK开发-之1——as2.3中新建工程自定义方法及日志打印

用任意编辑器打开:E:\android\adt-bundle-windows-x86_64-20140702\sdk\ndk-bundle\platforms\android-19\arch-arm\usr\include\android\log.h

NDK开发-之1——as2.3中新建工程自定义方法及日志打印

android系统有4种类型、6个优先级的log,有一些常量用于标识这些信息,相关的定义在

NDK开发-之1——as2.3中新建工程自定义方法及日志打印

靠看到什么鬼,原来是我定义的时候多写了一次宏

顺便提供一个github上的例子:(找上述问题是找到的)

https://github.com/androidthings/sample-nativepio/blob/master/button/src/main/cpp/button.cpp

现在看看正确的代码是

NDK开发-之1——as2.3中新建工程自定义方法及日志打印

运行看看是否打印log,看到效果,我知道已经通过了

NDK开发-之1——as2.3中新建工程自定义方法及日志打印

=====================

设置断点看看调试界面,看到下面的图片你是不是觉得很爽

NDK开发-之1——as2.3中新建工程自定义方法及日志打印

参考来源:

android官方文档:

https://developer.android.com/studio/projects/add-native-code.html

分享是一种美德,牵手是一种生活方式。

欢迎交流,转载请注明出处,谢谢!!!

展开阅读全文

没有更多推荐了,返回首页