JNI相关

JNI是什么

即Java Native Interface,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。
可以简单地理解为Java调用C/C++,C/C++调用Java的一套API。

C的函数名规则

Java_完整类名_函数名

JNIEnv

是一个结构体指针
代表Java的运行环境,调用Java中的代码
JNIEnv * 在C语言中是一个二级指针,在C++中是一级指针(JNIEnv就是一个结构体的别名)

#ifdef __cplusplus  //如果是C++
typedef JNIEnv_ JNIEnv;
#else
typedef const struct JNINativeInterface_ *JNIEnv;
#endif  
为什么一个用二级指针,一个用一级指针?

C++中的JNIEnv_内部依旧用的C的JNINativeInterface_ *,只是进行了封装。

为什么C要传JNIEnv,而C++不用传?

C中,在这些函数执行过程中,会用到JNIEnv。 而C++中有this,可以拿到当前这个JNIEnv对象,所以参数中不用传JNIEnv。

jclass和jobject

每个native函数,都至少有两个参数(JNIEnv*,jclass或者jobject)

  • 当native方法(Java方法)代表静态方法时:jclass 代表native方法(Java方法)所属类的class对象(JniTest.class)
  • 当native方法(Java方法)代表非静态方法时:jobject代表native方法(Java方法)所属类的class对象 (JniTest.class)

查看签名

cmd进入java程序的bin目录下,执行

javap -s -p com.ethanco.jni.bean.Human  

得到结果

Compiled from "Human.java"
public class com.ethanco.jni.bean.Human {
  public com.ethanco.jni.bean.Human();
    descriptor: ()V

  public void sayHi();
    descriptor: ()V
}

即,sayHi方法的签名是()V

其他详见Java Native Interface Specification.CHM文档

猜你喜欢

转载自blog.csdn.net/ethanco/article/details/79549178
JNI