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

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"); 【竟然也通过】


高手来指导一下原因吧
...全文
108 15 打赏 收藏 转发到动态 举报
写回复
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 了。
它可能是一个指针  
相关推荐

63,594

社区成员

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