带或不带括号的 JNIEnv 用法

JNIEnv usage with or without parenthasis?

本文关键字:JNIEnv 用法      更新时间:2023-10-16

我很好奇为什么jni编程指南说

JNI为C++程序员提供了一个稍微干净的界面。这 jni.h文件包含一组内联C++函数,以便本机 方法程序员可以简单地编写:

jclass cls = env->FindClass("java/lang/String");

而不是:

jclass cls = (*env)->FindClass(env, "java/lang/String");

env上的额外间接级别和 env参数 FindClass对程序员是隐藏的。C++编译器简单 将 C++ 成员函数调用扩展到其 C 对应项; 因此,生成的代码完全相同。

C 和 C++ 指针有什么区别?

C++ 指针是指向类object的指针。C指针是指向function的指针。它们是两回事。

因为C++ object已经知道环境,所以你不需要再次传递环境。

C指针是指向结构的指针,在该结构中调用函数。该函数没有状态,因此您需要传递状态(在本例中为相同的env结构体,以便它可以在此结构中找到变量。

JDK jni.h中,您会看到C++函数为:

jclass FindClass(const char *name) {
    return functions->FindClass(this, name);
}

functions是对象内部指向env的指针。因此,C++版本在内部扩展到C版本。