为什么感觉写JNI 这么难?

Java
240
0
0
2023-06-12

上篇文章中我们通过 Android Studio 玩了下 JNI 的demo,但是如果想更深一点学习 JNI 的话,还得需要懂得一些 Android Studio 中的一些知识点。

知识点一、JNI 函数的结构

这里要特别提醒一下,在 Java 类中声明的静态 native 方法和非静态 native 方法区别

即,二者的参数二的类型是不同的:

非静态声明的类型是 jobject 类型

静态声明的类型是 jclass 类型

知识点二、CMakeLists.txt 这个文件有什么作用

先去官网看看他的解释吧

CMakeLists.txt 是 CMake 构建工具用来构建 C/C++库的必要的文件。

CMakeLists.txt 文件内的配置也是很重要的,接下来我们来看一下其内部每个方法的作用。

我们先总览一下

嗯,这个文件中其实都给了非常详细的注释了,我们这里就简单理解下

① add_library()

add_library() 是用来配置生成动态链接库(so)的方法。里面的三个参数依次的作用是

  • 配置生成库(so)的名称
  • 设置生成库(so)的类型( static 或者 SHARED 两种选择)
  • 设置源文件(一个或多个)

② find_library()

find_library() 用来查找指定的已经构建过的库(so),以确保构建新的 so 库顺利。

两个参数依次的作用是

  • 设置查找库的名字(名字随意不影响查找)
  • 设置要查找的库的名字(名字必须准确,否则查找不到导致构建失败)

③ target_link_libraries()

target_link_libraries() 是用来将要生成的库与引用的库链接起来

两个参数依次的作用是

  • 指定要生成的库的名称(同 add_library() 的参数一)
  • 指定要链接的库的名称(链接 find_library() 的参数一)

这样配置完成后,CMakeLists.txt 就完成了,基础工作就完工了。

而这些,如果我们创建的项目是 native C++ 项目,那么这些配置会自动创建好,我们只要到我们自定的 native-lib.cpp 中去添加函数即可。

如果我们想在现有的非 native c++ 的项目上用 JNI 的话,那么就需要手动创建 CMakeLists.txt 这个文件,再利用 CMake 命令去构建项目了。

知识点三、JNI 中 C++ 基本数据类型

习惯了 java 的代码,突然让写 c++ 代码还是很生疏的,不过在jni 的 c++ 文件中,c++ 的数据结构和 java 的数据结构是一一对应的。

如下图:

基本数据类型对比

数组类型

其他类型

红色部分为区别,怎么样是不是很好记。

知识点四、JNI 中的常用函数

操作 字符串 相关

数组相关



NIO 缓冲区相关函数

JNI 访问 Java 类的方法和字段


其中调用 java 类中的返回值为基本类型的方法的静态和非静态方法,区别就是多了一个 static

如图

同样访问 java 类中的静态和非静态的字段也有同样的区分,如图


与上方方法配合使用的还有:

Java类型签名映射表

java 类型签名使用示例

① 提供被 c++ 调用的 java 类中的方法

② c++ 中的函数,红框内是对应的签名

③ 打印结果

全局引用和局部引用相关函数

异常处理相关函数

线程同步相关函数

嗯,如果你耐心看到结尾,那么恭喜你,这个时候再看 JNI 函数你就不会那么陌生了,但是如果还觉得陌生,那么…

再看一遍吧~~~

如果觉得这篇文章写得还不错,赏个赞吧~