java.lang.NoSuchFieldError: no "I" field XXXXin class "Lxx/xx/xx/xx;" or its superclasses

本文详细介绍了使用C语言通过JNI调用Java方法的过程,并针对一个常见错误——NoSuchFieldError进行了深入分析。文章展示了如何创建Java对象、设置字段值及解决特定编译器警告的重要性。
部署运行你感兴趣的模型镜像

用C语言写jni调用的时候,先FindClass ,之后通过GetFieldID 获取变量 然后通过SetIntField 等 去赋值


大约的流程如下:

// 获取类

clsDay = (*env)->FindClass(env, "com/xxx/xxx/xxxx/Day");

//获取method ,一般都是固定写法

jmethodID mid_init = (*env)->GetMethodID(env, clsDay , "<init>", "()V");

//创建对象

jobject data_struct = (*env)->NewObject(env, clsDay , mid_init);

//获取类里的变量
jfieldID type = (*env)->GetFieldID(env, clsDay , "type", "I");
jfieldID mon= (*env)->GetFieldID(env, clsDay , "mon", "F");


//给变量赋值
(*env)->SetIntField(env, data_struct, type, 1);
(*env)->SetFloatField(env, data_struct, mon, 12.00f);


如果类Day里面有 

{

int type;

float mon;

}

但老是找不到type

java.lang.NoSuchFieldError: no "I" field type in class "Lxx/xx/xx/xx;" or its superclasses 


关于这个报错,排查了很多次, 发现,如果你在Day这个类里面,没有去使用type, 就会报这个错误。所以在写代码时,一些编辑器给的警告也要注意下。

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>好的,我现在需要帮助用户解决他们在Android开发中遇到的`java.lang.NoSuchFieldError: androidx.lifecycle.ReportFragment$Companion`错误。用户之前提到他们参考了站内引用中的一个例子,其中涉及`fragmentation`库的版本冲突,并通过升级到`fragmentationx`解决了问题。现在用户的问题是针对`androidx.lifecycle.ReportFragment$Companion`字段缺失的错误,我需要结合之前的解决方案和用户当前的问题来提供有效的建议。 首先,我需要回忆一下这个错误通常发生的原因。`NoSuchFieldError`通常是由于编译时和运行时依赖的库版本不一致导致的。具体来说,当某个类在编译时存在某个字段,但在运行时该字段被移除或修改了,就会抛出这个错误。在这里,错误指向`androidx.lifecycle.ReportFragment$Companion`,说明这个Companion对象可能在不同版本的lifecycle库中有变化。 接下来,我需要考虑用户的环境。他们可能在使用AndroidX的库,特别是与生命周期相关的组件,比如`lifecycle-runtime`、`lifecycle-viewmodel`等。此外,用户可能引入了其他第三方库,这些库可能间接依赖了不同版本的AndroidX库,导致版本冲突。 根据用户之前的问题,他们参考了解决`fragmentation`库冲突的例子,通过升级库版本解决了问题。因此,我需要建议用户检查他们的项目依赖,特别是与AndroidX lifecycle相关的库版本是否一致,是否存在多个版本冲突的情况。 可能的解决方案步骤包括: 1. **检查依赖版本冲突**:使用Gradle命令(如`./gradlew app:dependencies`)查看项目依赖树,查找是否有不同版本的`androidx.lifecycle`库被引入。例如,可能有某个第三方库依赖了较旧版本的`lifecycle-runtime`,而主项目中使用了新版本,导致冲突。 2. **统一AndroidX库版本**:在项目的`build.gradle`文件中,确保所有AndroidX相关的库使用相同的版本。可以通过定义版本变量来统一管理,例如: ```gradle ext { lifecycle_version = "2.6.2" } implementation "androidx.lifecycle:lifecycle-runtime:$lifecycle_version" implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version" ``` 3. **排除传递依赖**:如果某个第三方库引入了旧版本的lifecycle库,可以使用Gradle的exclude功能排除该传递依赖。例如: ```gradle implementation("some.library") { exclude group: 'androidx.lifecycle', module: 'lifecycle-runtime' } ``` 4. **清理和重建项目**:在调整依赖后,执行清理和重新构建项目,确保更改生效。这包括使用`./gradlew clean build`命令或通过Android Studio的菜单选项进行清理。 5. **更新相关库**:检查是否有可用的更新版本第三方库,特别是那些已知与AndroidX lifecycle库存在兼容性问题的库。例如,用户之前提到的`fragmentationx`就是一个例子,可能需要类似的库升级。 6. **检查Kotlin版本兼容性**:由于Companion对象是Kotlin的特性,确保项目中的Kotlin版本与所有依赖库兼容,避免因Kotlin版本不一致导致的问题。 在思考过程中,我需要确保覆盖所有可能的冲突来源,并提供具体的操作步骤。同时,参考用户之前遇到的类似问题,强调依赖管理和版本统一的重要性。此外,提醒用户注意第三方库的兼容性,尤其是那些可能间接引入旧版本AndroidX库的库。 最后,我需要验证这些步骤是否实际可行,并确保用户能够按照指导解决问题。如果有必要,可以建议用户提供他们的`build.gradle`文件片段,以便更具体地分析依赖冲突的情况。</think>#### AndroidX Lifecycle `ReportFragment$Companion` 字段缺失的解决方案 此错误通常由 **依赖版本冲突** 或 **Kotlin 编译版本不兼容** 导致,以下是具体排查与修复步骤: --- ### 一、核心原因分析 1. **AndroidX Lifecycle 库版本不一致** - 项目依赖的 `androidx.lifecycle:lifecycle-runtime`、`lifecycle-viewmodel` 等组件版本不一致,例如: - 主模块使用 `2.6.0` - 第三方库间接依赖旧版本(如 `2.5.1`) - 新版 `ReportFragment` 类结构可能已调整,旧版本库缺少 `Companion` 字段[^1]。 2. **Kotlin 编译版本与依赖库冲突** - `ReportFragment` 是 Kotlin 类,若其伴生对象(`Companion`)的生成方式与项目编译的 Kotlin 版本不匹配,会引发字段缺失。 --- ### 二、解决方案步骤 #### 1. 统一 Lifecycle 组件版本 在 `build.gradle` 中强制指定所有 Lifecycle 依赖版本: ```gradle // app/build.gradle def lifecycle_version = "2.6.2" // 使用最新稳定版本 implementation "androidx.lifecycle:lifecycle-runtime:$lifecycle_version" implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version" implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version" ``` #### 2. 排查第三方库的间接依赖 执行以下命令分析依赖树: ```bash ./gradlew :app:dependencies --configuration releaseRuntimeClasspath ``` 查找 **冲突的 Lifecycle 版本**,例如: ``` +--- com.example:some-library:1.0.0 | \--- androidx.lifecycle:lifecycle-runtime:2.5.1 (冲突) ``` 对冲突库添加版本排除: ```gradle implementation("com.example:some-library") { exclude group: 'androidx.lifecycle', module: 'lifecycle-runtime' } ``` #### 3. 检查 Kotlin 版本一致性 确保项目与第三方库的 Kotlin 版本匹配: ```gradle // 项目根 build.gradle buildscript { ext.kotlin_version = '1.8.22' // 与 Lifecycle 2.6.2 兼容 dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } ``` #### 4. 清理构建缓存 - 执行 `File > Invalidate Caches / Restart` - 命令行清理: ```bash ./gradlew cleanBuildCache ``` --- ### 三、典型场景案例 1. **使用旧版 Fragment 库** 若项目依赖 `androidx.fragment:fragment:1.3.x`,升级至 `1.5.7` 以上以兼容 Lifecycle 2.6.x: ```gradle implementation 'androidx.fragment:fragment-ktx:1.6.1' ``` 2. **Hilt/Dagger 依赖冲突** Hilt 可能引入旧版 Lifecycle,需显式覆盖: ```gradle implementation "com.google.dagger:hilt-android:2.47" kapt "com.google.dagger:hilt-compiler:2.47" // 强制指定 Lifecycle 版本 configurations.all { resolutionStrategy.force "androidx.lifecycle:lifecycle-runtime:$lifecycle_version" } ``` --- ### 四、验证方案 在 `Application` 类中添加版本检查: ```kotlin Log.d("DependencyCheck", "Lifecycle: ${androidx.lifecycle.ReportFragment::class.java.protectionDomain.codeSource.location}") ``` 查看 Logcat 输出,确认所有模块加载的 Lifecycle 库路径一致。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值