gpt4 book ai didi

java - 在访问 JNI 接口(interface)时,为什么 C 需要额外的间接级别而 C++ 不需要?

转载 作者:太空宇宙 更新时间:2023-11-03 10:31:46 24 4
gpt4 key购买 nike

在代码中sample为了通过“C”访问,env 指针的用法如下:

const char *str = (*env)->GetStringUTFChars(env, s, 0);

而对于 C++,sample进行相同的调用:

const char *str = env->GetStringUTFChars(s, 0); 

文档接着说:

With C++, the extra level of indirection and the interface pointer argument disappear from the source code. However, the underlying mechanism is exactly the same as with C. In C++, JNI functions are defined as inline member functions that expand to their C counterparts.

该声明是否意味着 C++ 版本最终会扩展到 C 版本并具有相同的间接级别?

头文件没看,百思不得其解。有人可以解释这种差异吗?

最佳答案

问题中引用的解释解释了它。 C++ 支持内联成员函数之类的东西,但 C 不支持。 JNIEnv 的 C++ 定义包含 C 定义不包含的函数定义。 C++ 定义如下所示:

char const* JNIEnv::GetStringUTFChars(jstring s, jint i)
{
return (*this)->GetStringUTFChars(this, s, i);
}

C 版本中调用的函数实际上是一个函数指针。本质上,JNIEnv* 是一个 vptr,指向一个带有一堆 JNI 提供的函数指针的结构。为了方便起见,C++ 直接在 JNIEnv 中提供了额外的定义,以避免必须重复函数调用的 this 参数。

关于java - 在访问 JNI 接口(interface)时,为什么 C 需要额外的间接级别而 C++ 不需要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14389590/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com