我正在开发一个项目,我应该使用本机代码。 这是我项目中代码的一部分。
JNIEXPORT jstring JNICALL Java_com_pkg_testcpp_NatTes_nativemethod
(JNIEnv *env, jobject ob){
return (env)->NewStringUTF("NATIVE NON STATIC");
}
这是用CPP
写的。但是当我们在C
中编写相同的代码时,
return(* env) - > NewStringUTF(env,“NATIVE NON STATIC”);
我的问题是
1)为什么我们在c之前的env之前使用额外的*?
2)“ NewStringUTF ”它是一个函数指针或函数本身?
3)当通过指针访问结构成员时,我看到->
。所以env
是一个指向函数指针数组的指针?或者将函数指针作为结构成员的结构?
答案 0 :(得分:2)
jni.h头文件包含以下行:
#ifdef __cplusplus
typedef JNIEnv_ JNIEnv;
#else
typedef const struct JNINativeInterface_ *JNIEnv;
#endif
JNINativeInterface_是一个结构,主要包含以JNIEnv *
作为第一个参数的函数指针,其中还包括NewStringUTF
因此,C中的JNIEnv *
实际上是const struct JNINativeInterface_ **
,因此您需要取消引用一次,然后才能使用->
运算符来访问它的元素。在C ++中,JNIEnv *
是JNIEnv_ *
,JNIEnv_是一个结构,它包含指向JNINativeInterface_
的指针,因为它是第一个数据成员,否则定义了提供this
作为{JNIEnv *
的包装方法1}}第一个参数。