android JNI之 'GetObjectClass' in something not a structure or union

本文详细解析了在JNI环境中遇到的编译错误,特别是针对'GetObjectClass'和'GetFieldID'在不同类型的文件(.c和.cpp)中的正确调用方式。通过对比两种不同文件类型中的实例代码,本文旨在帮助开发者理解并避免此类常见错误。

编译错误提示:
/home/miyuehu/work/WebJsTest/jni/jnitest.c:22: error: request for member ‘GetObjectClass’ in something not a structure or union
/home/miyuehu/work/WebJsTest/jni/jnitest.c:23: error: request for member ‘GetFieldID’ in something not a structure or union

注意:jni.h头文件中对于.c & .cpp采用不同的定义

jclass (JNICALL *GetObjectClass) (JNIEnv *env, jobject obj);
jclass GetObjectClass(jobject obj) {
return functions->GetObjectClass(this,obj);
}

对于*.c
jclass test_class = (*env)->GetObjectClass(env, obj);
jfieldID id_num = (*env)->GetFieldID(env, test_class, “num”, “I”);

对于 *.cpp
jclass test_class = env->GetObjectClass(obj);
jfieldID id_num = env->GetFieldID(test_class, “num”, “I”);

在 C/C++ 编程中,当出现类似 `request for member 'count' in something not a structure or union` 的编译错误时,通常表示尝试访问一个非结构体或联合体类型的变量的成员字段。这种错误常见于以下几种情况: ### 1. 指针未解引用 如果使用了一个指向结构体的指针,但在访问其成员时没有进行解引用操作,则会出现该错误。例如: ```c struct MyStruct { int count; }; struct MyStruct *ptr; ptr = malloc(sizeof(struct MyStruct)); ptr.count = 10; // 错误:应该使用 ptr->count 或 (*ptr).count [^2] ``` 正确的写法应为: ```c ptr->count = 10; // 推荐方式 // 或者 (*ptr).count = 10; ``` ### 2. 类型不匹配 如果声明的变量并非结构体类型却试图访问其成员字段,也会导致此错误。例如: ```c int data; data.count = 5; // 错误:int 类型没有名为 count 的成员 [^1] ``` 此时应检查变量定义是否正确,并确认其数据类型是否包含相应的成员。 ### 3. 使用 C++ 语法在 C 文件中 在 JNI 开发过程中,若源文件是 `.c` 扩展名而代码中使用了 C++ 风格的语法(如 `env->FindClass(...)`),则会导致编译失败。这是因为 C 不支持面向对象风格的成员访问语法。JNI 中的 `JNIEnv` 在 C 和 C++ 中的使用方式不同: - **C语言**中应使用 `(*env)->FindClass(env, ...)`。 - **C++**中可以使用 `env->FindClass(...)`。 因此,在 `.c` 文件中应确保使用 C 风格调用,或者将文件重命名为 `.cpp` 并以 C++ 编译器进行编译 [^2]。 ### 4. 宏定义或条件编译问题 有时为了兼容 C 与 C++,开发者会使用预处理宏来切换接口定义。例如: ```c #ifdef __cplusplus extern "C" { #endif typedef struct { int count; } MyData; #ifdef __cplusplus } #endif ``` 如果没有正确识别当前编译环境,可能会导致结构体定义不一致,从而引发访问错误 [^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值