android NDK 的 -> 是什么意思
-> 是什么意思????
在 C++ 中,env->CallVoidMethod()
中的 ->
是 成员访问运算符(也称为箭头运算符),它用于通过指针访问对象的成员函数或成员变量。
->
的含义
-
env
是一个 指针(指向JNIEnv
结构体或类)。 -
->
用于通过指针访问其指向对象的成员(类似于.
运算符,但.
用于直接访问对象的成员,而->
用于指针)。 -
// 假设有一个结构体/类 JNIEnv struct JNIEnv {void CallVoidMethod(...); };// 情况1:env 是对象(直接使用 . 访问成员) JNIEnv env; env.CallVoidMethod(...);// 情况2:env 是指针(使用 -> 访问成员) JNIEnv* env = ...; env->CallVoidMethod(...);
为什么 JNI 里用 ->
?
在 JNI 中:
-
JNIEnv
实际上是一个 指向函数表的指针(在 C++ 中,它被封装成一个类,但仍然是指针)。 -
因此,必须使用
->
访问它的方法(如CallVoidMethod
)。 -
C 语言 vs C++ 的 JNIEnv 调用方式
-
C++ 风格(
env->CallVoidMethod()
):cpp文件:
env->CallVoidMethod(obj, methodID, ...);
-
C 风格(
(*env)->CallVoidMethod(env, ...)
):c文件:
(*env)->CallVoidMethod(env, obj, methodID, ...);
在 C 中,JNIEnv
是一个 指向函数表指针的指针,所以需要先解引用 (*env)
,再用 ->
访问方法。
并且,env
必须作为第一个参数传入(因为 C 没有隐含的 this
指针)。
. 总结
情况 | 示例 | 说明 |
---|---|---|
C++ JNI | env->CallVoidMethod(...) | env 是指向 JNIEnv 的指针,直接用 -> 访问方法 |
C JNI | (*env)->CallVoidMethod(env, ...) | env 是指向指针的指针,先解引用 (*env) ,再用 -> 访问方法 |
在 Android NDK 开发中,通常使用 C++ 风格的调用(env->XXX
),因为代码更简洁。