定义:Java Native Interface,即 Java本地接口
作用: 使得Java与本地其他类型语言(如C、C++)交互
JNI是Java调用 Native 语言的一种特性 JNI是属于Java 的,与 Android 无直接关系,实际中的驱动都是C/C++开发的,通过JNI,Java可以调用C/C++实现的驱动,从而扩展Java虚拟机的能力。
JNI与NDK的关系
JNI :Java平台JDK提供的一套非常强大的框架 Java Native Interface 相互调用交互通信:C C++ Native <——-> Java / Kotlin
NDK:Android平台提供的Native开发工具集开发包 Native Development Kit 后面把开始的JNI,拿到NDK里面来并进行封装 (JNI,gcc,g++,…)
jni.h 有两份: jni.h JDK版本与 NDK版本是不一样的:
NDK版本:Sdk\ndk\21.0.6113669\toolchains\llvm\prebuilt\windows x86_64\sysroot\usr\include\jni.h
JDK版本: Java\jdk1.8.0_131\include\jni.h
签名规则
C/C++调用java类对象的属性/方法的签名规则
java类型 | 属性类型符号 |
---|---|
boolean | Z |
byte | B |
char | C |
short | S |
int | I |
long | J |
float | F |
double | D |
void | V |
object | L完整的类名; String –> Llava/long/String; |
array[数组的数据类型 | int[] [I double[][] [[D |
method(参数类型)返回值类型 | void name(int a,double b) (ID)V |
C++ 与 Java 交互操作
NativeTest.java
1 | package com.xxx.test; |
native-lib.cpp
1 |
|
JNI函数细节介绍
1 | extern "C" |
extern “C” 的原因
1 | C++的情况如下: |
原因是: C:\Program Files\Java\jdk1.8.0_131\include\jni.h里面中,搜索查询,struct JNIEnv
1 | struct JNIEnv_; |
JNI数组操作
1 | public native void testArrayAction(int count, String textInfo, int[] ints, String[] strs); |
1 | // jint == int |
JNI对象操作
1 | public native void putObject(Student student, String str); // 传递引用类型,传递对象 |
1 | extern "C" |
JNI全局引用与局部引用
1 | // 在JNI函数中,会有,局部引用,全局引用 |
动态注册
Java_com_xxx_test_NativeTest_putObject这样的方式是静态注册,还有动态注册方法。
动态的优点:1.被反编译后安全性高一点, 2.在native中的调用,函数名简洁, 3. 编译后的函数标记较短一些
1 | //native方法 |
动态注册代码
1 | JavaVM *jVm = nullptr; |
JNI线程
1 | public native void naitveThread(); // Java层 调用 Native层 的函数,完成JNI线程 |
1 |
|
JNI数组排序
NativeTestKt.kt
1 | class NativeTestKt{ |
native-lib.cpp:
1 | / TODO 01.数组排序 |
异常捕获
1 | // 这里定义变量 |
1 | // 异常方式一: 【C++处理时异常】 |