【达人来帮忙解释一下】(*变量)->,怎么这种形式也对啊,为什么啊

flycsdn 2008-04-07 06:59:01
【达人来帮忙解释一下】(*变量)->,怎么这种形式也对啊,为什么啊
网上有很多例程,也调试的通哦

void func(JNIEnv *env, jclass cls , jint age )
{……

(*env)->FindClass(env, "Student");
……
}

JNIEnv 是一个类类型, 或者包含函数的结构体类型

请教请教

感觉只能:
(*env).FindClass(env, "Student"); 【通过】
或者
(env)->FindClass(env, "Student"); 【通过】



它却是(*env)->FindClass(env, "Student"); 【竟然也通过】


高手来指导一下原因吧
...全文
122 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
liutaoking 2008-04-07
  • 打赏
  • 举报
回复
good,可能这是最好的解释!
flycsdn 2008-04-07
  • 打赏
  • 举报
回复
破坏了结构体等类型和标准类型的理论运行模式的矛盾性,所以不伦不类
flycsdn 2008-04-07
  • 打赏
  • 举报
回复
哦,想明白了
可能是因为c中无类的概念,设计的时候 就没有 让类似类的结构体等类型 具备查找内联成员函数的能力,需要使用结构体内的函数,就需要通过结构体地址,强制取用,所以演变成一个怪现象了
flycsdn 2008-04-07
  • 打赏
  • 举报
回复
8楼谢谢谢,有用
但这个差别实在没有道理,c凭什么这么做,怎么解释,烦
c这么做自然有c的逻辑解释,怎么解释?
c这么做自然有c的逻辑解释,怎么解释?
c这么做自然有c的逻辑解释,怎么解释?


WingForce 2008-04-07
  • 打赏
  • 举报
回复

//jni.h

struct JNINativeInterface_;
struct JNIEnv_;

#ifdef __cplusplus
typedef JNIEnv_ JNIEnv;
#else
typedef const struct JNINativeInterface_ *JNIEnv;
#endif


结果应该挺显然的

hastings 2008-04-07
  • 打赏
  • 举报
回复
class B
{
public:
void foo()
{
cout<<"B::foo()\n";
}
};
template<typename T>
class Ptr
{
T* m_p;
Ptr(const Ptr&);
Ptr& operator=(const Ptr&);
public:
Ptr(T* p=0):m_p(p){}
~Ptr(){delete m_p;}
T* operator->(){return m_p;}
const T* operator->()const{return m_p;}
T& operator*(){return *m_p;}
const T& operator*()const{return *m_p;}
};
typedef Ptr<B> JNIEnv;
void func(JNIEnv* p)
{
(*p)->foo();
}
int main()
{
JNIEnv a(new B);
func(&a);
return 0;
}
liutaoking 2008-04-07
  • 打赏
  • 举报
回复
8楼的应该差不多!
bestvalentine 2008-04-07
  • 打赏
  • 举报
回复
看看这个blog,或许有帮助.

http://www.blogjava.net/woxingwosu/archive/2008/02/15/179947.html
flycsdn 2008-04-07
  • 打赏
  • 举报
回复

typedef JNIEnv_ JNIEnv;

……


struct JNIEnv_ {
const struct JNINativeInterface_ *functions;
#ifdef __cplusplus

jint GetVersion() {
return functions->GetVersion(this);
}
……
…………………………………………………………………………………………………………………………
jweak NewWeakGlobalRef(jobject obj) {
return functions->NewWeakGlobalRef(this,obj);
}
void DeleteWeakGlobalRef(jweak ref) {
functions->DeleteWeakGlobalRef(this,ref);
}

jboolean ExceptionCheck() {
return functions->ExceptionCheck(this);
}

jobject NewDirectByteBuffer(void* address, jlong capacity) {
return functions->NewDirectByteBuffer(this, address, capacity);
}
void* GetDirectBufferAddress(jobject buf) {
return functions->GetDirectBufferAddress(this, buf);
}
jlong GetDirectBufferCapacity(jobject buf) {
return functions->GetDirectBufferCapacity(this, buf);
}
jobjectRefType GetObjectRefType(jobject obj) {
return functions->GetObjectRefType(this, obj);
}

#endif /* __cplusplus */
};









rickone 2008-04-07
  • 打赏
  • 举报
回复
那个JNIEnv的完整定义列出来看下...
lori_c 2008-04-07
  • 打赏
  • 举报
回复
我貌似也碰到过,通过编译,那运行正确吗?
flycsdn 2008-04-07
  • 打赏
  • 举报
回复
3楼,请看2楼
JNIEnv 是一个包含函数的结构体类型
Inhibitory 2008-04-07
  • 打赏
  • 举报
回复
JNIEnv 很可能是一个typedef定义的指针.
因为->只有指针能用.

例如:
#include <iostream>

int main() {
typedef int** pptr;
int a = 10;
int *p = &a;
pptr pp = &p;
std::cout << *(*pp)<< std::endl;

return 0;
}


flycsdn 2008-04-07
  • 打赏
  • 举报
回复
楼上的请注意,我已经说明了:JNIEnv 是一个类类型, 或者包含函数的结构体类型
楼上的请看:

typedef JNIEnv_ JNIEnv;

struct JNIEnv_ {
const struct JNINativeInterface_ *functions;
#ifdef __cplusplus

jint GetVersion() {
return functions->GetVersion(this);
}
jclass DefineClass(const char *name, jobject loader, const jbyte *buf,
jsize len) {
return functions->DefineClass(this, name, loader, buf, len);
}
……

}
zlcs8921 2008-04-07
  • 打赏
  • 举报
回复
我的程序中就有很多这样的例子阿:
 list<BaseType *>::iterator listIter; 
 listIter=variableList.begin();
 if( (*listIter)->getType().compare("enum")==0 )  
delete (cEnum *)(*listIter);

关键看 JNIEnv 了。
它可能是一个指针  
VC6下安装与配置 Wikipedia,自由的百科全书 本手册适应 OpenCV 1.0 安装。 目录 [隐藏] 1 安装Visual C++ 6.0 2 安装OpenCV 3 配置Windows环境变量 4 配置Visual C++ 6.0 4.1 全局设置 4.2 项目设置 [编辑]安装Visual C++ 6.0 略。 [编辑]安装OpenCV 从http://www.opencv.org.cn/ 下载OpenCV安装程序。假如要将OpenCV安装到C:\\Program Files\\OpenCV。(下面附图为OpenCV 1.0rc1的安装界面,OpenCV 1.0安装界面与此基本一致。)在安装时选择\"将\\OpenCV\\bin加入系统变量\"(Add\\OpenCV\\bin to the systerm PATH)。 [编辑]配置Windows环境变量 检查C:\\Program Files\\OpenCV\\bin是否已经被加入到环境变量PATH,如果没有,请加入。 [编辑]配置Visual C++ 6.0 [编辑]全局设置 菜单Tools->Options->Directories:先设置lib路径,选择Library files,在下方填入路径: C:\\Program Files\\OpenCV\\lib 然后选择include files,在下方填入路径: C:\\Program Files\\OpenCV\\cxcore\\include C:\\Program Files\\OpenCV\\cv\\include C:\\Program Files\\OpenCV\\cvaux\\include C:\\Program Files\\OpenCV\\ml\\include C:\\Program Files\\OpenCV\\otherlibs\\highgui C:\\Program Files\\OpenCV\\otherlibs\\cvcam\\include [编辑]项目设置 每创建一个将要使用OpenCV的VC Project,都需要给它指定需要的lib。菜单:Project->Settings,然后将Setting for选为All Configurations,然后选择右边的link标签,在Object/library modules附加上 cxcore.lib cv.lib ml.lib cvaux.lib highgui.lib cvcam.lib 如果你不需要这么多lib,你可以只添加你需要的lib。

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧