上篇文章中我们通过 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 函数你就不会那么陌生了,但是如果还觉得陌生,那么…
再看一遍吧~~~
如果觉得这篇文章写得还不错,赏个赞吧~