JNI相关,
分享于 点击 45411 次 点评:121
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文档
相关文章
- 暂无相关文章
用户点评