JNI工程的框架分析

  • 1. JNI工程的组成部分
  • 2. 各个部分之间的关系

JNI开发笔记(一)–Android Studio安装与环境搭建
JNI开发笔记(二)–创建JNI基础工程并运行

1. JNI工程的组成部分

Android Studio 4.0以后的版本可以直接建立JNI的基础工程并且可以直接运行,这个在JNI开发笔记(二)中已经实现,这篇文章就重点讲述一下JNI工程的组成部分以及各个部分之间的关系。

如下图所示,Android Studio自带的JNI模板工程中最重要的三个文件是红框中的部分:MainActivity, CMakeLists.txt, native-lib.cpp。


下面来讲一下这三个文件都是负责干什么的:

  • MainActivity
    该文件是.java文件,是JNI工程的主函数文件,相当于C/C++中的main文件,相关语句的注释已经标注在代码中。
public class MainActivity extends AppCompatActivity {// Used to load the 'native-lib' library on application startup.// 这里是用来导入我们native-lib, 这样才可以调用我们native-lib.cpp中的函数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 method// 在手机上显示一块文本的区域,区域显示的内容是"Hello from C++"TextView tv = findViewById(R.id.sample_text);tv.setText(stringFromJNI());}/*** A native method that is implemented by the 'native-lib' native library,* which is packaged with this application.*/// 这里声明了一个native方法,这个方法在我们的native-lib.cpp中定义的,该方法的效果就是输出一个字符串"Hello from C++"public native String stringFromJNI();
}
  • CMakeLists.txt
    CMakeLists.txt编译c或者c++代码的时候的一个脚本文件,它的作用是将.c/.cpp和.h文件编译到我们的JNI工程中,这样我们就可以在JNI里面调用相应的函数。在这个文件里,官方的基础例程已经完成了绝大所数操作,我们只需要修改我们的so库的名字,添加我们自己的.c/.cpp和.h文件就可以了。相关的注释已经标注在代码中,为了看着明显,我使用了//而不是#。
# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html# Sets the minimum version of CMake required to build the native library.cmake_minimum_required(VERSION 3.10.2)# Declares and names the project.project("test")# 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.// 这里是对JNI库的添加
add_library( # Sets the name of the library.// 这里我们可以更改JNI库的名字,比如可以改成 JniTest-lib 等native-lib# Sets the library as a shared library.// 在SHARED后面我们需要添加我们自己的.c/.h文件,这样才可以把源文件编译进去SHARED# Provides a relative path to your source file(s).// 这里添加的是native-lib.cpp,建议不要更改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.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.// 如果之前更改了名字,我们需要在这里同步一下,比如改成JniTest-libnative-lib# Links the target library to the log library# included in the NDK.${log-lib} )
  • native-lib.cpp
    native-lib.cpp这个文件是我们需要主要修改的文件。这个文件的作用就是将C/C++中的函数接口封装到Java中来,Android Studio自带的JNI工程中, native-lib.cpp中的函数stringFromJNI()是直接实现的,并没有体现出这个文件的真正作用。当我们有大量的C/C++文件时,我们需要将接口在这个文件中做一个封装,变成Java可以识别的样子,这样Java就可以识别到这个封装好的接口,并通过它来调用C/C++中的函数。
#include <jni.h>
#include <string>extern "C" JNIEXPORT jstring JNICALL
Java_com_jni_test_MainActivity_stringFromJNI(JNIEnv* env,jobject /* this */) {std::string hello = "Hello from C++";return env->NewStringUTF(hello.c_str());
}

2. 各个部分之间的关系

JNI工程最主要的三个文件MainActivity, CMakeLists.txt, native-lib.cpp之间的关系如下图所示,CMakeLists和native-lib两个文件和生成的so库紧密相关,而MainActivity只是通过调用二者生成的so库来使用。换句话说,如果我们要生成so库给java用,只需要编写CMakeLists和native-lib两个文件即可,我们在MainActivity中实现的一般是调用这个so库来做测试的功能。下一篇JNI开发笔记(四)会通过一个简单的JNI实例来进一步凸显这个关系。

JNI开发笔记(三)--JNI工程的框架分析相关推荐

  1. JNI开发笔记(五)--JNI语法总结

    JNI语法总结 引 前言 1. 传参类型为变量/变量指针 1.1 变量 1.2 变量指针 2. 传参类型为数组指针 3. 传参类型为结构体指针 引 JNI开发笔记(一)–Android Studio安 ...

  2. JNI开发笔记(四)--实现一个简单的JNI工程并生成so库

    实现一个简单的JNI工程并生成so库 引 前言 1. 编写C/h文件并添加到工程 2. 修改CmakeLists.txt文件 3. 编写native-lib.cpp文件 4. 在MainActivit ...

  3. JNI开发笔记(八)--Java读取txt文件进行JNI测试

    Java读取txt文件进行JNI测试 引 前言 1. 新建assets文件夹 2. 载入测试文件 3. 建立文件读取方法 4. 在MainActivity中读取文件数据 引 JNI开发笔记(一)–An ...

  4. JNI开发笔记(七)--aar库的生成和调用

    aar库的生成和调用 引 前言 1. 新建一个空工程 2. 新建一个Module 3. 移植JNI工程到Module中 4. 生成aar库与so库 5. 在另一个工程中调用aar库 引 JNI开发笔记 ...

  5. JNI开发笔记(六)--一种更规范的so库生成方法

    一种更规范的JNI工程写法 引 前言 1. MainActivity中的两个重要的语句 2. 建立Util类来替代MainActivity 3. 在MainActivity中验证JNI工程并生成so库 ...

  6. JNI开发笔记(二)--创建JNI基础工程并运行

    创建JNI基础工程并运行 引 1. 创建JNI工程 2. 添加虚拟手机设备 3. 运行JNI基础工程 引 JNI开发笔记(一)–Android Studio安装与环境搭建 1. 创建JNI工程 And ...

  7. 【Visual C++】游戏开发笔记三十七 浅墨DirectX提高班之五 顶点缓存的红颜知己 索引缓存的故事

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

  8. 【Visual C++】游戏开发笔记三十七 浅墨DirectX提高班之五 顶点缓存的红颜知己:索引缓存的故事

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8304741 作者:毛星云(浅墨 ...

  9. nrf52832 学习笔记(二)SDK框架分析

    nrf52832 学习笔记(二)SDK框架分析 个人对SDK框架的一些理解,如有错误欢迎斧正. flash 分区 在不包含DFU的情况下,nrf52832 flash划分为: MBR 0x000000 ...

最新文章

  1. centos格式化优盘命令_centos 磁盘分区、格式化及挂载
  2. 阿里如何实现100%容器化镜像化?八年技术演进之路回顾
  3. 景安河南机房电力事故,部分主机和云服务器停机
  4. Py之prettytable:prettytable的简介、安装、使用方法之详细攻略
  5. pdf更新啦,快来瞧瞧!
  6. Jmeter4.0分布式测试时启动Jmeter.server时报错
  7. ethtool 原理介绍和解决网卡丢包排查思路(附ethtool源码下载)
  8. 凤凰刷机软件连接不上手机的解决办…
  9. 微信网页支付小白指南-域内浏览器支付 + 外部浏览器支付
  10. canny算法(3)——非极大值抑制
  11. mysql nutch_nutch2.2+mysql部署
  12. 破解app 在so层的密钥key
  13. 32g的u盘速度测试软件,ToShiBa 东芝4G 8G 16G 32G 64G U盘量产教程(已测)
  14. ArcGis 加载tif,tpk,shp格式文件
  15. 2022年6月大学英语六级翻译
  16. html标签栏logo怎么加,在htmltitle/title标签添加图标,网页title左边显示网页的logo图标...
  17. C# 文件目录的操作DirectoryInfo
  18. linux密码配置文件详解,用户配置文件与密码配置文件
  19. Python:有趣的猜数字小游戏
  20. elm分类器功能_一文带你读懂线性分类器

热门文章

  1. 子类实现父类接口时注解为啥报错_Java中的注解使用:全面性的总结一下
  2. java复选框批量删除_vue+element+Java实现批量删除功能
  3. MacOS 安装 Telnet
  4. MySQL优化常见Extra分析——慢查询优化
  5. Oracle定时任务
  6. 微信支付官方SDK V3 .NET版的坑
  7. java多态与对象转型
  8. flex学习网站大全(转)
  9. java基础—Runtime类使用
  10. java 程序语言中的LinkedList 集合基本方法演示