JNI开发系列目录

  1. JNI开发必学C++基础
  2. JNI开发必学C++使用实践
  3. Android Studio 4.0.+NDK项目开发详细教学
  4. Android NDK与JNI的区别有何不同?
  5. Android Studio 4.0.+NDK .so库生成打包
  6. Android JNI的深度进阶学习
  7. 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开发,先要进行配置。

  1. 安装NDK
  2. 配置NDK环境

    复制NDK的路径进入系统环境变量中
  3. 环境配置成功
    然后打开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();
  1. 静态代码块中的代码在应用程序启动时就会加载native-lib 本地库
  2. Java代码通过stringFromJNI()本地等方法接口调用C++函数

补充:如果是对旧有项目进行支持NDK,只需要将上面三个文件对应添加,将build.gradle配置一下即可。


NDK调用流程

运行程序如下图,发现在MainActivity中已能调用Jni代码中的C++代码了。我们整理下JNI的运行流程。

运行流程:

  1. 在编译运行时,Gradle调用了CMakeLists.txt文件,将C++源文件native-lib.cpp编译到共享对象中,并命名为libnative-lib.so
  2. Gradle将libnative-lib.so与apk打包在一起。将生成的apk解压是可以得到证明的
  3. 在程序运行时,由于System.loadLibrary()是静态代码块中调用的,所以在程序加载后libnative-so 已被加载
  4. 在Java程序中调用stringFromJNI()方法,通过JNI接口调用了C++中的stringFromJNI()函数。

总结

  1. Android运行在Dalvik或者ART虚拟机上,执行.dex文件的Java代码,其实虚拟机上也能允许C/C++代码。

  2. 在虚拟机中有一层Native层,里面有很多Android的核心代码,且这些代码使用C/C++写的。我们看源码时追踪代码最终源头发现很多都是native申明的方法。在这其实已经使用到了JNI/NDK技术了。

  3. NDK是Android 的开发工具包,如同SDK是帮助Android开发者开发Java程序一样,NDK能帮助Android开发者快速开发C/C++程序。它在开发中提供对C/C++的的自动提示和编译检测。

  4. 通过NDK工具可以将C/C++动态库编译成.so文件,可以将.so文件与应用程序一起打包成apk

  5. NDK是采用JNI机制实现的,它可以将C/C++代码编译到原生库中

本篇博文主要讲解了使用Android Studio 4.0.+创建NDK项目的详细过程,对于碰到的问题进行解决和项目结构的讲解。

对于NDK开发的进阶学习请继续阅读我的下一篇博文。


相关链接

  1. JNI开发必学C++基础
  2. JNI开发必学C++使用实践
  3. Android Studio 4.0.+NDK项目开发详细教学
  4. Android NDK与JNI的区别有何不同?
  5. Android Studio 4.0.+NDK .so库生成打包
  6. Android JNI的深度进阶学习
  7. Android Studio 4.0.+NDK开发 This files is not part of the project

博客书写不易,您的点赞收藏是我前进的动力,千万别忘记点赞、 收藏 ^ _ ^ !

Android Studio 4.0.+NDK项目开发详细教学相关推荐

  1. android studio项目总结,android studio 3.0 升级 项目遇到的问题及更改思路(问题小结)...

    Android Studio从3.0版本新增了许多功能,当然首当其冲就是从3.0版本新增了对 Kotlin 开发语言的支持,除此之外还有其他一些新功能,例如:Android Profiler (其中包 ...

  2. AndroidStudio制作欢迎界面与应用图标,使用Android Studio 3.0.1作为开发工具

    点击上方    "黄广达"    ,选择    "置顶公众号" 有趣有内涵的文章第一时间送达! 喝酒I创作I分享 生活中总有些东西值得分享 前言 大家好,我是  ...

  3. 神经网络API、Kotlin支持,那些你必须了解的Android 8.1预览版和Android Studio 3.0新特性

    曾仅用 55 秒发布会的 Android 8.0 Oreo 在时隔两个月后,Google 于今天在其官方网站上正式发布了 Android 8.1 首个开发者预览版,此次升级涵盖了针对多个功能的提升优化 ...

  4. 更新Android Studio 3.0,你遇到坑了吗?

    今天把Android Studio更新到3.0,跑了一下之前的项目,遇到了以下6个坑,在这总结一下. Android Studio 3.0,项目SDK环境必须要26以上.所以: compileSdkV ...

  5. 在android studio中配置ndk开发环境

    环境:android studio 1.5 android-ndk-r10b 1.下载android-ndk-r10b,解压. 2.android studio创建新项目, 配置ndk环境 打开fil ...

  6. Android 自定义安全软键盘 SafeKeyboard 开发详细说明 2.0

    Android 自定义安全软键盘 SafeKeyboard 开发详细说明 2.0 源码地址:GitHub:    https://github.com/SValence/SafeKeyboard 注意 ...

  7. Android Studio 2.0:速度提升,极大提高开发效率

    转至:http://android.jobbole.com/82127/ Android Studio 2.0:速度提升,极大提高开发效率 11月24日,在 Android Developer Sum ...

  8. android studio 3.0新功能介绍

    谷歌2017发布会更新了挺多内容的,而且也发布了AndroidStudio3.0预览版,一些功能先睹为快.(英语一般,有些翻译不太好) 下载地址 https://developer.android.g ...

  9. visual studio 最新稳定版本_速来围观!Android Studio 4.0 稳定版发布了

    作者:恋猫de小郭 Android Studio 4.0(2020年5月) 更新啦!此版本包含了各种新功能和改进,还有一些废弃配置. 重要提示:更新后,需要重新启动 Android Studio 才能 ...

最新文章

  1. C++编译器Qt Creator下载地址
  2. 任意次序的n个烙饼最小反转次数求解 暑期学习笔记(十)
  3. Docker cgroups作用(十)
  4. iOS 集成银联支付swift
  5. 【SSH网上商城项目实战05】完成数据库的级联查询和分页
  6. IDEA06 代码规范检测插件之Alibaba Java Coding Guidelines
  7. Linux常用命令之文件和目录处理命令
  8. 神经网络入门概念和框架理解(YOLOv1v2v3改进分析)
  9. [USACO14JAN]Recording the Moolympics
  10. TensorFlow 辨异 —— tf.add(a, b) 与 a+b(tf.assign 与 =)、tf.nn.bias_add 与 tf.add
  11. 计算二叉树的叶子结点个数_C++数据结构二叉树统计总结点个数,叶子结点个数,单分支结点个数,双分支结点个数。...
  12. iphone上开发即时聊天工具
  13. 基于FOC矢量算法的MTPA控制在变频洗衣机上的应用
  14. 【学习day1】图像分类数据集+softmax回归
  15. 如何解决jupyter notebook更换浏览器时需要输入密码的问题
  16. 爬虫之使用阿布云伪装IP
  17. 谷歌的新系统Fuchsia OS根本不能替代安卓
  18. 关联规则挖掘(Apriori算法和FP-Growth算法)
  19. 微信公众号 修改 应用签名 不生效
  20. Problem:博览购票

热门文章

  1. 连云存储魔力象限都进不了,就别提三年之内中国第一了吧!
  2. ASP:IT外包敲门砖
  3. 十三届蓝桥杯大赛 报名进行中,参赛得奖你上你也行
  4. python实现因子分析
  5. c语言主界面设计菜单系统,c语言界面设计代码的操作步骤,你学会了吗
  6. 计算机和电视连接网络6,网络电视哪个好 6款好用网络电视推荐
  7. 广域网优化技术领跑IT投资
  8. Qi产品认证标准无线充发射端线圈分类
  9. 指南:内网穿透与DDNS动态域名解析区别,一篇看懂
  10. 崽崽百度指数批量查询工具【过安全验证】