JNI遇到error: request for member 'FindClass' in something not a structure or union

本文详细解释了在C和C++环境中正确使用JNI (Java Native Interface) 的方法,特别是针对FindClass成员函数的调用方式差异。文章指出,在C程序中应当使用 (*env)->FindClass(env, java/lang/String) 形式,而在C++环境中则直接使用 env->FindClass(java/lang/String)。此外,还提到了在Linux环境下.c文件与.cpp文件调用的区别。

 error: request for member 'FindClass' in something not a structure or union

可能的问题是:

如果是c程序,要用 (*env)->
如果是C++要用 env->

ps:在linux下如果.c文件中用 “env->” 编译会找不到此结构,必须用“(*env)->”,或者改成.cpp文件,以 c++的方式来编译。

以下是两者的区别:

jni.h中

struct JNINativeInterface_;

struct JNIEnv_;

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

/*
* We use inlined functions for C++ so that programmers can write:
*
*   env->FindClass("java/lang/String")
*
* in C++ rather than:
*
*    (*env)->FindClass(env, "java/lang/String")
*
* in C.
*/

即C++中使用
env->FindClass("java/lang/String")


C中使用

(*env)->FindClass(env, "java/lang/String")

在 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]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值