Java 在访问JNI接口时,为什么C需要额外级别的间接寻址,而C++;不';T

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++版本最终会

在通过“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++版本最终会扩展到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++中,你得到一个指针,它很好地为你做了一半。