JNI初体验

Java中调用jni代码

Java代码:

native关键字指定该方法是native方法
同时在Java代码中调用so库

jni代码

h头文件中

将方法声明放到extern "C" {}的方法体内

  • 函数名命名规则: Java_包名_类名_方法名, 其中包名中的"."用"_"替换
  • JNIEnv* 指向JNI环境的指针, 通过它访问JNI提供的接口方法
  • jobject 表示Java对象中的this

cpp文件中

include上面的h文件

JNI调用Java中的代码

先通过类名找到类, 然后根据方法名找到方法的ID, 然后就可以调用了;

以静态方法为例, 非静态需先构造类对象

  • 找类: jclass jclass1=env->FindClass("类的签名");
  • 找方法: jmethodID jmethodID1=env->GetStaticMethodID(jclass1,"方法名(Java中的方法名)","方法的签名");
  • 调用: env->CallStaticVoidMethodA(jclass1,jmethodID1,"方法参数");

.h文件

.cpp文件


JNI的数据类型和类型签名

基本数据类型

Java类型 本地类型 描述
boolean jboolean C/C++8位整型
byte jbyte C/C++带符号的8位整型
char jchar C/C++无符号的16位整型
short jshort C/C++带符号的16位整型
int jint C/C++带符号的32位整型
long jlong C/C++带符号的64位整型e
float jfloat C/C++32位浮点型
double jdouble C/C++64位浮点型
Object jobject 任何Java对象,或者没有对应java类型的对象
Class jclass Class对象
String jstring 字符串对象
Object[] jobjectArray 任何对象的数组
boolean[] jbooleanArray 布尔型数组
byte[] jbyteArray 比特型数组
char[] jcharArray 字符型数组
short[] jshortArray 短整型数组
int[] jintArray 整型数组
long[] jlongArray 长整型数组
float[] jfloatArray 浮点型数组
double[] jdoubleArray 双浮点型数组

签名

  • 类的签名
    "L+包名+类名+;", 将'.'替换成'/',例如String的签名就是Ljava/lang/Sring;,';'是存在的.
  • 基本数据类型的签名
Java类型 签名
boolean Z
byte B
char C
short S
int I
long J
float F
double D
void V
  • 对象的签名
    对象的签名就是它所属的类的签名
  • 数组的签名
    "[+类型签名",int[]的签名为[I
    "n个[+类型签名",多维,int[][]的签名为[[I
  • 方法的签名
    "(参数类型签名)+返回值类型签名"
    例如:void fun1(int i), 签名为(I)V
0 Comments
Leave a Reply