Java 在访问JNI接口时,为什么C需要额外级别的间接寻址,而C++;不';T
在通过“C”访问的代码中,env指针的用法如下:Java 在访问JNI接口时,为什么C需要额外级别的间接寻址,而C++;不';T,java,c++,c,java-native-interface,Java,C++,C,Java Native Interface,在通过“C”访问的代码中,env指针的用法如下: const char *str = (*env)->GetStringUTFChars(env, s, 0); 对于C++,调用相同的调用: const char *str = env->GetStringUTFChars(s, 0); 文件接着说: C++,间接源代码和接口指针参数从源代码中消失。然而,底层机制与C++中的C.完全相同,JNI函数定义为扩展到C类对应的内联成员函数。 < P>这条语句是否意味着C++版本最终会
const char *str = (*env)->GetStringUTFChars(env, s, 0);
对于C++,调用相同的调用:
const char *str = env->GetStringUTFChars(s, 0);
文件接着说:
C++,间接源代码和接口指针参数从源代码中消失。然而,底层机制与C++中的C.完全相同,JNI函数定义为扩展到C类对应的内联成员函数。 < P>这条语句是否意味着C++版本最终会扩展到C版本并具有相同的间接级别?
我还没有看过头文件,但我很困惑。有人能解释一下这种差异吗?我还没有确切检查他们是如何实现它的,但我很有信心它是这样的:
char const* JNIEnv::GetStringUTFChars(jstring s, jint i)
{
return (*this)->GetStringUTFChars(this, s, i);
}
- 在C++中,JNENV*将是“方法”,这使得方法可以使用Env指针以及 。
- 在C语言中,函数(结构中的函数指针指向该函数)使用它的唯一方法是,有人将其作为参数传递
char const* JNIEnv::GetStringUTFChars(jstring s, jint i)
{
return (*this)->GetStringUTFChars(this, s, i);
}
- 在C++中,JNENV*将是“方法”,这使得方法可以使用Env指针以及 。
- 在C语言中,函数(结构中的函数指针指向该函数)使用它的唯一方法是,有人将其作为参数传递
- 问题中引用的解释解释了这一点。C++支持内联成员函数,但C不支持。<代码> JNENV的C++定义包括C定义不定义的函数定义。C++的定义看起来是这样的:
char const* JNIEnv::GetStringUTFChars(jstring s, jint i)
{
return (*this)->GetStringUTFChars(this, s, i);
}
在C版本中调用的函数实际上是一个函数指针。本质上,
JNIEnv*
是一个vptr,用一堆JNI提供的函数指针指向一个结构。C++在“代码> JNIENV < /代码>中提供了额外的定义,以方便使用,避免重复调用函数调用的< <代码> >参数。 < P>问题中引用的解释解释了它。C++支持内联成员函数,但C不支持。<代码> JNENV的C++定义包括C定义不定义的函数定义。C++的定义看起来是这样的:
char const* JNIEnv::GetStringUTFChars(jstring s, jint i)
{
return (*this)->GetStringUTFChars(this, s, i);
}
在C版本中调用的函数实际上是一个函数指针。本质上,JNIEnv*
是一个vptr,用一堆JNI提供的函数指针指向一个结构。C++在“代码”> JNIENV 中直接提供了额外的定义,以避免重复调用函数调用的< <代码> >参数。 < P>,查看,JNI.H在标题中有:
770 /*
771 * We use inlined functions for C++ so that programmers can write:
772 *
773 * env->FindClass("java/lang/String")
774 *
775 * in C++ rather than:
776 *
777 * (*env)->FindClass(env, "java/lang/String")
778 *
779 * in C.
780 */
781
782 struct JNIEnv_ {
783 const struct JNINativeInterface_ *functions;
784 #ifdef __cplusplus
785
786 jint GetVersion() {
787 return functions->GetVersion(this);
788 }
感谢大家澄清这一点。因此,看看,jni.h的标题中有以下内容:
770 /*
771 * We use inlined functions for C++ so that programmers can write:
772 *
773 * env->FindClass("java/lang/String")
774 *
775 * in C++ rather than:
776 *
777 * (*env)->FindClass(env, "java/lang/String")
778 *
779 * in C.
780 */
781
782 struct JNIEnv_ {
783 const struct JNINativeInterface_ *functions;
784 #ifdef __cplusplus
785
786 jint GetVersion() {
787 return functions->GetVersion(this);
788 }
谢谢大家澄清这一点。@KerrekSB:放松点,伙计。它是超链接的。@KerrekSB和JNI的标准部分……我同意@KerrekSB。你粘贴了上面的代码,难道你不能再粘贴几行,这样我们就可以在不使用Ctrl-F键的情况下获得完整的图片,或者在google上搜索typedefs或API文档吗?我觉得这个问题很有趣,尽管@KerrekSB(像往常一样直接)提出了一个很好的观点。写这个问题所花的时间本来可以用来纠正“我没有看头文件”的错误,使这个问题从一开始就没有意义。不过,答案还是不错的,所以这是一个加号。@KerrekSB:放松点,伙计。它是超链接的。@KerrekSB和JNI的标准部分……我同意@KerrekSB。你粘贴了上面的代码,难道你不能再粘贴几行,这样我们就可以在不使用Ctrl-F键的情况下获得完整的图片,或者在google上搜索typedefs或API文档吗?我觉得这个问题很有趣,尽管@KerrekSB(像往常一样直接)提出了一个很好的观点。写这个问题所花的时间本来可以用来纠正“我没有看头文件”的错误,使这个问题从一开始就没有意义。不过,好的答案,这是一个加成。+ 1,这与从C++对C执行COM方法的机制基本相同,对于那些没有处理基于C的COM代码的特权(读诅咒)的人来说。在C语言中,你得到一个“vtbl”指针,你必须去引用它才能得到要调用的实际函数指针;在C++中,你得到一个这个指针,它很好地为你工作一半。+ 1,这与从C++到C执行COM方法的机制基本相同,对于那些没有处理基于C的COM代码的特权(读诅咒)的人来说。在C语言中,你得到一个“vtbl”指针,你必须去引用它才能得到要调用的实际函数指针;在C++中,你得到一个指针,它很好地为你做了一半。