安装 CMake、LLDB与NDK 开发工具包

CMake 简介

CMake 是一款比make更强大的编译自动配置工具,它可以根据不同平台、不同的编译器,并通过CMakeLists.txt文件中简单的语句来描述所有平台的编译过程,生成相应的Makefile文件或project文件。CMake被引入于AndroidStudio2.2,其目的是替代原有的JNI/DNK开发方法,使AS在进行JNI/NDK时更加的方便、高效。

CMake的优势

  • 允许直接在C/C++代码中加入断点,调试;
  • 在Java层中使用“ctrl+左键”快捷键能够直接进入本地方法对应的C/C++代码中;
  • C/C++中使用“ctrl+鼠标点击”快捷键能够直接进入头文件或库;
  • 自动生成函数原型头文件,无需配置android.useDeprecatedNdk=true属性;

LLDB 简介

LLDB是一个高效的C/C++调试器,它提供了丰富的流程控制和数据检测,有效地帮助我们调试程序。Android Studio通过引入LLDB调试器,能够实现对NDK本地代码的调试。

创建支持C/C++开发的Android工程

在Android studio 3.3中直接new一个Project,然后按照以下流程 操作 首先选择 Native C++

在Customize C++ Support部分,可以使用下列选项自定义项目。

C++ Standard:选择哪一种C++标准,默认选择Toolchain Default选项,其会使用默认的Cmake配置;

工程结构解析

- externalNativeBuild文件夹:用于存放cmake编译好的文件,包括支持的各种硬件等信息,有点类似于build.gradle文件明确Gradle如何编译APP; - cpp文件夹:存放C/C++代码文件,native-lib.cpp文件默认生成的; - CMakeLists.txtcmake脚本配置文件,cmake会根据该脚本文件中的指令去编译相关的C/C++源文件,并将编译后产物生成共享库或静态块,然后Gradle将其打包到APK中。

CMakeLists.txt文件解析如下:

指定cmake版本cmake_minimum_required(VERSION 3.4.1)
add_library命令用于向cmake添加依赖库或者源文件 参数(函数名称,库类型,依赖源文件相对路径)
add_library(
# Sets the name of the library.
# 生成函数库的名称,即libnative-lib.so或libnative-lib.a(lib和.so/.a默认缺省)        JNILearning
#生成库类型,动态库为SHARED 静态库为STATIC
# Sets the library as a shared library.
SHARED
#依赖 c/cpp相对路径
# Provides a relative path to your source file(s).        JNILearning.cpp)
定位ndk中的库
find_library( # Sets the name of the path variable.# 设置path变量的名称,这里为NDK中的日志库log-lib#指定cmake查询库的名称#即在ndk开发包中查询liblog.so函数库,将其路径赋值给log-lib# Specifies the name of the NDK library that# you want CMake to locate.log)
指定想要关联的原生库
target_link_libraries( # Specifies the target library.# 指定目标库,与上面指定的函数库名一致JNILearning# 链接的库,根据log-lib变量对应liblog.so函数库# Links the target library to the log library# included in the NDK.${log-lib})

运行效果

通过查看native-lib.cpp方法,stringFromJNI目的是向Java层返回一个字符串。如果要在native-lib.cpp文件中添加新的方法,必须添加在extern"C" { }中,或者在每个方法前加extern"C", 否则会报找不到方法。如果源文件为C,则须将extern“C”部分去掉,因为extern "C"的作用就是告诉编译器以C方式编译。

extern "C" JNIEXPORT jstring JNICALL
/*** CPP 源文件,返回一个字符串* @param env* @return*/
Java_com_example_jnilearndemo_MainActivity_stringFromJNI(JNIEnv *env,jobject /* this */) {std::string hello = "Hello from C++";return env->NewStringUTF(hello.c_str());
}

构建和运行APP流程: - Gradle调用外部构建脚本CmakeLists.txt; - CMake 按照构建脚本中的命令将 C++ 源文件 native-lib.cpp 编译到共享的对象库中,并命名为libnative-lib.so,Gradle 随后会将其打包到 APK 中; - 运行时,应用的 MainActivity 会使用 System.loadLibrary()加载原生库,至此,调用so中的方法才会生效。

本地代码调试

第一次本地代码调试需要初始化一些工具需要一定时间,后面再调试就很快了 当使用Eclipse进行NDK/JNI开发时,基本无法对C/C++本地代码调试,而Android Studio却非常容易。AS通过借助LLDB调试工具,可以非常方便地对C/C++本地代码进行调试。LLDB调试的步骤基本与调试Java层代码一致,只是断点标志在C/C++函数中。

android ndk怎样加载o文件_JNI初探之NDK 开发环境配置相关推荐

  1. Android studio 使用心得(六)---android studio 如何加载.so文件

    2019独角兽企业重金招聘Python工程师标准>>> 之前一直没怎么注意,以为.so文件android为像eclipse一样直接加载,但是直到昨天我在android studio上 ...

  2. android ndk怎样加载o文件_在Android中使用TFLite c++部署

    之前的文章中,我们跟大家介绍过如何使用NNAPI来加速TFLite-Android的inference(可参考使用NNAPI加速android-tflite的Mobilenet分类器).不过之前介绍的 ...

  3. android使用webview加载flash文件

    android 字段webview几乎实现了浏览器的全部功能,最近在使用webview加载不固定格式的文章,文章中有一部分嵌入了flash,下面就是webview可以进行视频需要进行的设置,代码如下: ...

  4. android webview拦截加载离线文件

    概述 客户端经常会通过使用webview来用H5实现一些ios与android双端都有的功能,最常见的比如一些活动页面,内部广告页面等. 这些页面大概会有以下几个特点: 要求webview快一些,白屏 ...

  5. Android 使用Webview加载PDF文件

    一.核心代码 protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setCon ...

  6. 通过加载 QSS 文件的方式美化 QT 界面

    通过加载 QSS 文件的方式美化 QT 界面 1 配置工程 在进行配置之前,建议先在工程的根目录下新建一个 .qss 文件,方便后面的添加 1.打开目标工程,选中此工程,鼠标右键单击 Add New ...

  7. Android(Java)加载SO文件

    原文地址点击打开链接 一.前言 Android中有时候为了效率以及平台开发库的支持,难免会用到NDK开发,那么都会产生一个so文件,通过native方法进行调用,开发和调用步骤很简单,这里就不多说了, ...

  8. 【Android 安全】DEX 加密 ( 代理 Application 开发 | 加载 dex 文件 | 将系统的 dexElements 与 应用的 dexElements 合并 | 替换操作 )

    文章目录 一.将系统的 dexElements 与 应用的 dexElements 合并 二.Element[] dexElements 替换操作 三.完整 dex 加载源码 参考博客 : [Andr ...

  9. 【Android 安全】DEX 加密 ( 代理 Application 开发 | 加载 dex 文件 | 使用反射获取方法创建本应用的 dexElements | 各版本创建 dex 数组源码对比 )

    文章目录 一.不同 Android 系统创建 dex 数组源码对比 二.不同 Android 系统创建 dex 数组源码对比 三. Android 5.1 及以下系统反射方法并创建 Element[] ...

最新文章

  1. 《安全测试指南》——信息收集测试【学习笔记】
  2. python中定义函数常用关键字_Python 中定义函数的关键字是 _________________ 。_学小易找答案...
  3. c++整理程序 dev_C编程从入门到实践:C语言开发工具详解(2)
  4. oracle 9.2.0.1下载,Oracle 9i 从9.2.0.1升级到 9.2.0.6 步骤
  5. vscode快捷键:多行同时输入
  6. C#用域账号登陆,访问网络路径
  7. 微信很好用却很少人知道的浮窗功能
  8. [面试题]100层楼丢玻璃球,一旦超过某层就会破,你只有两个球。
  9. 个子矮s弯如何看点打方向图解_s弯如何看点打方向图解?s弯方向盘打法口诀
  10. 1033:计算线段长度
  11. 乔布斯逝去十年 苹果坠入凡间?
  12. excel里面身份证号显示不全
  13. GIS定位和自定义图标
  14. Reso | liunx下longeneQQ和搜狗拼音
  15. wordpress仿站实战教程:wordpress调用函数记录
  16. Firebird数据库的安装配置与使用
  17. 一文读懂LoRa天线架构设计,LoRa设备开发参考指南(十三)
  18. Easy File Sharing Server7.2漏洞复现
  19. Linux内存管理回收机制
  20. 有类路由与无类路由的区别

热门文章

  1. 网友教会GPT-3骂人、DeepMind再造机器人
  2. 如何使用 BERT 进行自然语言处理?
  3. 新款华为手机,免费带回家
  4. 【每日一算法】罗马数字转整数
  5. ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`meiduo`.`
  6. MySQL数据库修改表结构
  7. Javascrapy的window onload()函数用法
  8. PanoNet3D:一个基于激光雷达点云语义和几何理解的3D目标检测方法
  9. 计算机视觉方向简介 | 阵列相机立体全景拼接
  10. 任意多相机系统的SLAM重设计