Android Studio 4.0.+NDK项目开发详细教学
JNI开发系列目录
- JNI开发必学C++基础
- JNI开发必学C++使用实践
- Android Studio 4.0.+NDK项目开发详细教学
- Android NDK与JNI的区别有何不同?
- Android Studio 4.0.+NDK .so库生成打包
- Android JNI的深度进阶学习
- Android Studio 4.0.+NDK开发 This files is not part of the project
NDK项目创建
- <font color=#11897D>前言
- <font color=#11897D>NDK环境配置
- <font color=#11897D>NDK项目创建
- <font color=#11897D>工程文件说明
- <font color=#11897D>NDK调用流程
- <font color=#11897D>总结
博客创建时间:2020.10.26
博客更新时间:2022.9.18
以Android studio 4.0.2来分析讲解,所以是Android最新版NDK项目创建,其截图可能与低版本不一样。
前言
涉及到一些算法或者底层驱动的时候,往往需要使用jni来开发。关于NDK和JNI如果还不了解,请查看我的另一篇博文《Android NDK与JNI的区别有何不同?》进行科普,创建NDK项目开干。
NDK环境配置
想要使用Android Studio 进行NDK开发,先要进行配置。
- 安装NDK
- 配置NDK环境
复制NDK的路径进入系统环境变量中
- 环境配置成功
然后打开cmd,输入ndk-build,可见环境已经配置好了。
NDK项目创建
使用Android Sudio创建DNK项目的方式有两种:一种是直接创建C++ project;另一种是在Java 项目中手动配置,虽然更麻烦些,但是更灵活值得学习。
现在官方推荐使用CMake工具来开发jni,cmake方式开发jni项目相对更简单易上手。可以将NDK类别为SDK,将Cmake类别为build,将它看作一个编译类工具。
新建项目直接勾选C++ project进行项目创建。
创建完项目后自动生成的.cpp文件会报红,一般方法解决不了该问题,请阅读我的另一博文《Android Studio 4.0+NDK开发 This files is not part of the project》
工程文件说明
用Android Studio 创建的默认Native C++项目默认有三个比较特殊的文件CMakeLists.txt、native-lib.cpp、MainActivty。这三个文件下面我们一一详细说明
除了以上三个文件,还有app build.gradle文件配置有差异外,其他地方与我们创建的普通Android 项目并无差异。
注意:在Build 4.+以后,CMakeLists.txt的路径在src/main/cpp路径下
1. CMakeLists.txt文件
# Sets the minimum version of CMake required to build the native library.
# 设置构建本机库所需的CMake最低版本。
cmake_minimum_required(VERSION 3.4.1)# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.
# 创建并命名一个库,将其设置为STATIC或SHARED,并提供其源代码的相对路径。
# 您可以定义多个库,CMake会为您构建它们。Gradle自动将共享库与您的APK打包在一起。
add_library( # Sets the name of the library.#库的名称native-lib# Sets the library as a shared library.SHARED# Provides a relative path to your source file(s).# 库所在位置的相对路径native-lib.cpp )# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.
# 搜索指定的预构建库并将路径存储为变量。由于默认情况下CMake在搜索路径中包括系统库,因此您只需要指定要添加的公共NDK库的名称即可。
# 在完成构建之前,CMake会验证该库是否存在。
find_library( # Sets the name of the path variable.log-lib# Specifies the name of the NDK library that# you want CMake to locate.log )# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.target_link_libraries( # Specifies the target library.native-lib# Links the target library to the log library# included in the NDK.${log-lib} )
2. native-lib.cpp
在创建C++ project时默认生成的示例调用文件,包含了jni代码
3. MainActivty
// Used to load the 'native-lib' library on application startup.static {System.loadLibrary("native-lib");}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// Example of a call to a native methodTextView tv = findViewById(R.id.sample_text);tv.setText(stringFromJNI());}public native String stringFromJNI();
- 静态代码块中的代码在应用程序启动时就会加载native-lib 本地库
- Java代码通过stringFromJNI()本地等方法接口调用C++函数
补充:如果是对旧有项目进行支持NDK,只需要将上面三个文件对应添加,将build.gradle配置一下即可。
NDK调用流程
运行程序如下图,发现在MainActivity中已能调用Jni代码中的C++代码了。我们整理下JNI的运行流程。
运行流程:
- 在编译运行时,Gradle调用了CMakeLists.txt文件,将C++源文件native-lib.cpp编译到共享对象中,并命名为libnative-lib.so
- Gradle将libnative-lib.so与apk打包在一起。将生成的apk解压是可以得到证明的
- 在程序运行时,由于System.loadLibrary()是静态代码块中调用的,所以在程序加载后libnative-so 已被加载
- 在Java程序中调用stringFromJNI()方法,通过JNI接口调用了C++中的stringFromJNI()函数。
总结
Android运行在Dalvik或者ART虚拟机上,执行.dex文件的Java代码,其实虚拟机上也能允许C/C++代码。
在虚拟机中有一层Native层,里面有很多Android的核心代码,且这些代码使用C/C++写的。我们看源码时追踪代码最终源头发现很多都是native申明的方法。在这其实已经使用到了JNI/NDK技术了。
NDK是Android 的开发工具包,如同SDK是帮助Android开发者开发Java程序一样,NDK能帮助Android开发者快速开发C/C++程序。它在开发中提供对C/C++的的自动提示和编译检测。
通过NDK工具可以将C/C++动态库编译成.so文件,可以将.so文件与应用程序一起打包成apk
NDK是采用JNI机制实现的,它可以将C/C++代码编译到原生库中
本篇博文主要讲解了使用Android Studio 4.0.+创建NDK项目的详细过程,对于碰到的问题进行解决和项目结构的讲解。
对于NDK开发的进阶学习请继续阅读我的下一篇博文。
相关链接:
- JNI开发必学C++基础
- JNI开发必学C++使用实践
- Android Studio 4.0.+NDK项目开发详细教学
- Android NDK与JNI的区别有何不同?
- Android Studio 4.0.+NDK .so库生成打包
- Android JNI的深度进阶学习
- Android Studio 4.0.+NDK开发 This files is not part of the project
博客书写不易,您的点赞收藏是我前进的动力,千万别忘记点赞、 收藏 ^ _ ^ !
Android Studio 4.0.+NDK项目开发详细教学相关推荐
- android studio项目总结,android studio 3.0 升级 项目遇到的问题及更改思路(问题小结)...
Android Studio从3.0版本新增了许多功能,当然首当其冲就是从3.0版本新增了对 Kotlin 开发语言的支持,除此之外还有其他一些新功能,例如:Android Profiler (其中包 ...
- AndroidStudio制作欢迎界面与应用图标,使用Android Studio 3.0.1作为开发工具
点击上方 "黄广达" ,选择 "置顶公众号" 有趣有内涵的文章第一时间送达! 喝酒I创作I分享 生活中总有些东西值得分享 前言 大家好,我是 ...
- 神经网络API、Kotlin支持,那些你必须了解的Android 8.1预览版和Android Studio 3.0新特性
曾仅用 55 秒发布会的 Android 8.0 Oreo 在时隔两个月后,Google 于今天在其官方网站上正式发布了 Android 8.1 首个开发者预览版,此次升级涵盖了针对多个功能的提升优化 ...
- 更新Android Studio 3.0,你遇到坑了吗?
今天把Android Studio更新到3.0,跑了一下之前的项目,遇到了以下6个坑,在这总结一下. Android Studio 3.0,项目SDK环境必须要26以上.所以: compileSdkV ...
- 在android studio中配置ndk开发环境
环境:android studio 1.5 android-ndk-r10b 1.下载android-ndk-r10b,解压. 2.android studio创建新项目, 配置ndk环境 打开fil ...
- Android 自定义安全软键盘 SafeKeyboard 开发详细说明 2.0
Android 自定义安全软键盘 SafeKeyboard 开发详细说明 2.0 源码地址:GitHub: https://github.com/SValence/SafeKeyboard 注意 ...
- Android Studio 2.0:速度提升,极大提高开发效率
转至:http://android.jobbole.com/82127/ Android Studio 2.0:速度提升,极大提高开发效率 11月24日,在 Android Developer Sum ...
- android studio 3.0新功能介绍
谷歌2017发布会更新了挺多内容的,而且也发布了AndroidStudio3.0预览版,一些功能先睹为快.(英语一般,有些翻译不太好) 下载地址 https://developer.android.g ...
- visual studio 最新稳定版本_速来围观!Android Studio 4.0 稳定版发布了
作者:恋猫de小郭 Android Studio 4.0(2020年5月) 更新啦!此版本包含了各种新功能和改进,还有一些废弃配置. 重要提示:更新后,需要重新启动 Android Studio 才能 ...
最新文章
- C++编译器Qt Creator下载地址
- 任意次序的n个烙饼最小反转次数求解 暑期学习笔记(十)
- Docker cgroups作用(十)
- iOS 集成银联支付swift
- 【SSH网上商城项目实战05】完成数据库的级联查询和分页
- IDEA06 代码规范检测插件之Alibaba Java Coding Guidelines
- Linux常用命令之文件和目录处理命令
- 神经网络入门概念和框架理解(YOLOv1v2v3改进分析)
- [USACO14JAN]Recording the Moolympics
- TensorFlow 辨异 —— tf.add(a, b) 与 a+b(tf.assign 与 =)、tf.nn.bias_add 与 tf.add
- 计算二叉树的叶子结点个数_C++数据结构二叉树统计总结点个数,叶子结点个数,单分支结点个数,双分支结点个数。...
- iphone上开发即时聊天工具
- 基于FOC矢量算法的MTPA控制在变频洗衣机上的应用
- 【学习day1】图像分类数据集+softmax回归
- 如何解决jupyter notebook更换浏览器时需要输入密码的问题
- 爬虫之使用阿布云伪装IP
- 谷歌的新系统Fuchsia OS根本不能替代安卓
- 关联规则挖掘(Apriori算法和FP-Growth算法)
- 微信公众号 修改 应用签名 不生效
- Problem:博览购票