android O 32位系统报错:JNI DETECTED ERROR IN APPLICATION: use of deleted local reference

本文主要是介绍android O 32位系统报错:JNI DETECTED ERROR IN APPLICATION: use of deleted local reference,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、同样的程序我在android O 64位系统上跑没有任何问题,但是在32位系统上跑就报这个错误
问题原因是:
自己写的类中有这个构造函数:
public AnWBT_BLE_Service(int service_type, long mostSiguuid, long leastSiguuid, int handle, int end_group_handle, ArrayList<AnWBT_BLE_Characteristic> characteristic) {
    this.service_type = service_type;
    this.mostSiguuid = mostSiguuid;
    this.leastSiguuid = leastSiguuid;
    this.handle = handle;
    this.end_group_handle = end_group_handle;
    this.characteristic = characteristic;
}
然后再JNI调用这个构造函数:
jmethodID service_init = env->GetMethodID(service_cls,"<init>","(IJJIILjava/util/ArrayList;)V");
这种调用方式就会有问题。
二、修改方法:使用没有参数的构造函数,然后使用set方法来设置类里面的成员变量
jclass service_cls = env->FindClass("com/anwsdk/service/AnWBT_BLE_Service");
jmethodID service_init = env->GetMethodID(service_cls,"<init>","()V");
jmethodID service_setService_type = env->GetMethodID(service_cls,"setService_type","(I)V");
jmethodID service_setMostSiguuid = env->GetMethodID(service_cls,"setMostSiguuid","(J)V");
jmethodID service_setLeastSiguuid = env->GetMethodID(service_cls,"setLeastSiguuid","(J)V");
jmethodID service_setHandle = env->GetMethodID(service_cls,"setHandle","(I)V");
jmethodID service_setEnd_group_handle = env->GetMethodID(service_cls,"setEnd_group_handle","(I)V");
jmethodID service_setCharacteristic = env->GetMethodID(service_cls,"setCharacteristic","(Ljava/util/ArrayList;)V");

三、AnWBT_BLE_Service类的代码

package com.anwsdk.service;import android.os.Parcel;
import android.os.Parcelable;import java.util.ArrayList;
import java.util.List;public class AnWBT_BLE_Service implements Parcelable {private int service_type;private long mostSiguuid;private long leastSiguuid;private int handle;private int end_group_handle;private ArrayList<AnWBT_BLE_Characteristic> characteristic;public AnWBT_BLE_Service() {}public AnWBT_BLE_Service(int service_type, long mostSiguuid, long leastSiguuid, int handle, int end_group_handle, ArrayList<AnWBT_BLE_Characteristic> characteristic) {this.service_type = service_type;this.mostSiguuid = mostSiguuid;this.leastSiguuid = leastSiguuid;this.handle = handle;this.end_group_handle = end_group_handle;this.characteristic = characteristic;}protected AnWBT_BLE_Service(Parcel in) {service_type = in.readInt();mostSiguuid = in.readLong();leastSiguuid = in.readLong();handle = in.readInt();end_group_handle = in.readInt();ArrayList<AnWBT_BLE_Characteristic> characteristic_new = new ArrayList<AnWBT_BLE_Characteristic>();in.readTypedList(characteristic_new,AnWBT_BLE_Characteristic.CREATOR);characteristic = characteristic_new;}public int getService_type() {return service_type;}public long getMostSiguuid() {return mostSiguuid;}public long getLeastSiguuid() {return leastSiguuid;}public int getHandle() {return handle;}public int getEnd_group_handle() {return end_group_handle;}public ArrayList<AnWBT_BLE_Characteristic> getCharacteristic() {return characteristic;}public void setService_type(int service_type) {this.service_type = service_type;}public void setMostSiguuid(long mostSiguuid) {this.mostSiguuid = mostSiguuid;}public void setLeastSiguuid(long leastSiguuid) {this.leastSiguuid = leastSiguuid;}public void setHandle(int handle) {this.handle = handle;}public void setEnd_group_handle(int end_group_handle) {this.end_group_handle = end_group_handle;}public void setCharacteristic(ArrayList<AnWBT_BLE_Characteristic> characteristic) {this.characteristic = characteristic;}@Overridepublic int describeContents() {return 0;}@Overridepublic void writeToParcel(Parcel dest, int flags) {dest.writeInt(service_type);dest.writeLong(mostSiguuid);dest.writeLong(leastSiguuid);dest.writeInt(handle);dest.writeInt(end_group_handle);dest.writeTypedList(characteristic);}public static final Creator<AnWBT_BLE_Service> CREATOR = new Creator<AnWBT_BLE_Service>() {@Overridepublic AnWBT_BLE_Service createFromParcel(Parcel in) {return new AnWBT_BLE_Service(in);}@Overridepublic AnWBT_BLE_Service[] newArray(int size) {return new AnWBT_BLE_Service[size];}};
}

四、JNI层修改前代码

/*
* Class : com_anwsdk_service
* Method :GATT_GetService()
* Signature : (J)Ljava/util/List;
*/
JNIEXPORT jobject JNICALL Java_com_anwsdk_service_anwbtservice_GATT_GetService(JNIEnv *env, jobject,jlong gatt)
{ANW_LOGI("+++ GATT_GetService---");int i = 0;GATT_HANDLE gattHandle = (GATT_HANDLE)gatt;jclass arraylist_cls = env->FindClass("java/util/ArrayList");jmethodID arraylist_init = env->GetMethodID(arraylist_cls,"<init>","()V");	jmethodID arraylist_add = env->GetMethodID(arraylist_cls, "add", "(Ljava/lang/Object;)Z");jobject service_arraylist = env->NewObject(arraylist_cls,arraylist_init,""); if(gattHandle == NULL){return service_arraylist;}AnW_BLE_Device device;GetBLEDeviceManagerByGATTHandle(&device,gattHandle);if(device.gatt_handle == NULL || device.download_status != BLE_DOWNLOAD_STATUS_COMPLETE){return service_arraylist;}jclass descriptor_cls = env->FindClass("com/anwsdk/service/AnWBT_BLE_Descriptor");jmethodID descriptor_init = env->GetMethodID(descriptor_cls,"<init>","(IJJ[B)V"); jclass characteristic_cls = env->FindClass("com/anwsdk/service/AnWBT_BLE_Characteristic");jmethodID characteristic_init = env->GetMethodID(characteristic_cls,"<init>","(IIIJJ[BLjava/util/ArrayList;)V");  jclass service_cls = env->FindClass("com/anwsdk/service/AnWBT_BLE_Service");jmethodID service_init = env->GetMethodID(service_cls,"<init>","(IJJIILjava/util/ArrayList;)V");for(i = 0;i < device.service_count;i++){jobject characteristic_arraylist = env->NewObject(arraylist_cls,arraylist_init,""); AnW_BLE_Service *service = &(device.ble_service[i]);int j = 0;for(j = 0;j < service->characteristic_count;j++){jobject descriptor_arraylist = env->NewObject(arraylist_cls,arraylist_init,"");AnW_BLE_Service_Info_Characteristic *characteristic = &(service->characteristic[j]);jbyteArray characteristic_value = charToByteArray(env, (const char*)characteristic->value,characteristic->value_len);			int k = 0;for(k = 0;k < characteristic->descriptor_count;k++){AnW_BLE_Service_Info_Characteristic_Descriptor *descriptor = &(characteristic->descriptor[k]);jbyteArray descriptor_value = charToByteArray(env, (const char*)descriptor->value,descriptor->value_len);jobject descriptor_obj = env->NewObject(descriptor_cls,descriptor_init,descriptor->handle,*(long *)(descriptor->uuid + 8),*(long *)(descriptor->uuid),descriptor_value); env->CallBooleanMethod(descriptor_arraylist, arraylist_add, descriptor_obj);}jobject characteristic_obj = env->NewObject(characteristic_cls,characteristic_init,characteristic->handle,characteristic->properties,characteristic->value_handle,*(long *)(characteristic->uuid + 8),*(long *)(characteristic->uuid),characteristic_value,descriptor_arraylist); env->CallBooleanMethod(characteristic_arraylist, arraylist_add, characteristic_obj);}jobject service_obj = env->NewObject(service_cls,service_init,service->service_type,*(long *)(service->uuid + 8),*(long *)(service->uuid),service->handle,service->end_group_handle,characteristic_arraylist); env->CallBooleanMethod(service_arraylist, arraylist_add, service_obj);}ANW_LOGI("--- GATT_GetService ---");return service_arraylist;
}

JNI层修改后代码(这里面其实还修改了一个long类型)

jlong uuid_lsb(u_int8* uuid) {jlong lsb = 0;for (int i = 7; i >= 0; i--) {lsb <<= 8;lsb |= uuid[i];}return lsb;
}jlong uuid_msb(u_int8* uuid) {jlong msb = 0;for (int i = 15; i >= 8; i--) {msb <<= 8;msb |= uuid[i];}return msb;
}
/*
* Class : com_anwsdk_service
* Method :GATT_GetService()
* Signature : (J)Ljava/util/List;
*/
JNIEXPORT jobject JNICALL Java_com_anwsdk_service_anwbtservice_GATT_GetService(JNIEnv *env, jobject,jlong gatt){ANW_LOGI("+++ GATT_GetService---(0x%llx)",gatt);int i = 0;GATT_HANDLE gattHandle = (GATT_HANDLE)gatt;jclass arraylist_cls = env->FindClass("java/util/ArrayList");jmethodID arraylist_init = env->GetMethodID(arraylist_cls,"<init>","()V");	jmethodID arraylist_add = env->GetMethodID(arraylist_cls, "add", "(Ljava/lang/Object;)Z");jobject service_arraylist = env->NewObject(arraylist_cls,arraylist_init,""); if(gattHandle == NULL){return service_arraylist;}AnW_BLE_Device device;GetBLEDeviceManagerByGATTHandle(&device,gattHandle);if(device.gatt_handle == NULL || device.download_status != BLE_DOWNLOAD_STATUS_COMPLETE){return service_arraylist;}jclass descriptor_cls = env->FindClass("com/anwsdk/service/AnWBT_BLE_Descriptor");jmethodID descriptor_init = env->GetMethodID(descriptor_cls,"<init>","()V"); jmethodID descriptor_setHandle = env->GetMethodID(descriptor_cls,"setHandle","(I)V");jmethodID descriptor_setMostSiguuid = env->GetMethodID(descriptor_cls,"setMostSiguuid","(J)V");jmethodID descriptor_setLeastSiguuid = env->GetMethodID(descriptor_cls,"setLeastSiguuid","(J)V");jmethodID descriptor_setValue = env->GetMethodID(descriptor_cls,"setValue","([B)V");jclass characteristic_cls = env->FindClass("com/anwsdk/service/AnWBT_BLE_Characteristic");jmethodID characteristic_init = env->GetMethodID(characteristic_cls,"<init>","()V");jmethodID characteristic_setHandle = env->GetMethodID(characteristic_cls,"setHandle","(I)V");jmethodID characteristic_setProperties = env->GetMethodID(characteristic_cls,"setProperties","(I)V");jmethodID characteristic_setValue_handle = env->GetMethodID(characteristic_cls,"setValue_handle","(I)V");jmethodID characteristic_setMostSiguuid = env->GetMethodID(characteristic_cls,"setMostSiguuid","(J)V");jmethodID characteristic_setLeastSiguuid = env->GetMethodID(characteristic_cls,"setLeastSiguuid","(J)V");jmethodID characteristic_setValue = env->GetMethodID(characteristic_cls,"setValue","([B)V");jmethodID characteristic_setDescriptor = env->GetMethodID(characteristic_cls,"setDescriptor","(Ljava/util/ArrayList;)V");jclass service_cls = env->FindClass("com/anwsdk/service/AnWBT_BLE_Service");jmethodID service_init = env->GetMethodID(service_cls,"<init>","()V");jmethodID service_setService_type = env->GetMethodID(service_cls,"setService_type","(I)V");jmethodID service_setMostSiguuid = env->GetMethodID(service_cls,"setMostSiguuid","(J)V");jmethodID service_setLeastSiguuid = env->GetMethodID(service_cls,"setLeastSiguuid","(J)V");jmethodID service_setHandle = env->GetMethodID(service_cls,"setHandle","(I)V");jmethodID service_setEnd_group_handle = env->GetMethodID(service_cls,"setEnd_group_handle","(I)V");jmethodID service_setCharacteristic = env->GetMethodID(service_cls,"setCharacteristic","(Ljava/util/ArrayList;)V");for(i = 0;i < device.service_count;i++){jobject characteristic_arraylist = env->NewObject(arraylist_cls,arraylist_init,""); AnW_BLE_Service *service = device.ble_service + i;int j = 0;for(j = 0;j < service->characteristic_count;j++){jobject descriptor_arraylist = env->NewObject(arraylist_cls,arraylist_init,"");AnW_BLE_Service_Info_Characteristic *characteristic = &(service->characteristic[j]);jbyteArray characteristic_value = charToByteArray(env, (const char*)characteristic->value,characteristic->value_len);			int k = 0;for(k = 0;k < characteristic->descriptor_count;k++){AnW_BLE_Service_Info_Characteristic_Descriptor *descriptor = &(characteristic->descriptor[k]);jbyteArray descriptor_value = charToByteArray(env, (const char*)descriptor->value,descriptor->value_len);jobject descriptor_obj = env->NewObject(descriptor_cls,descriptor_init,""); env->CallVoidMethod(descriptor_obj,descriptor_setHandle,descriptor->handle);env->CallVoidMethod(descriptor_obj,descriptor_setMostSiguuid,uuid_msb(descriptor->uuid));env->CallVoidMethod(descriptor_obj,descriptor_setLeastSiguuid,uuid_lsb(descriptor->uuid));env->CallVoidMethod(descriptor_obj,descriptor_setValue,NULL);env->CallBooleanMethod(descriptor_arraylist, arraylist_add, descriptor_obj);}jobject characteristic_obj = env->NewObject(characteristic_cls,characteristic_init,""); env->CallVoidMethod(characteristic_obj,characteristic_setHandle,characteristic->handle);env->CallVoidMethod(characteristic_obj,characteristic_setProperties,characteristic->properties);env->CallVoidMethod(characteristic_obj,characteristic_setValue_handle,characteristic->value_handle);env->CallVoidMethod(characteristic_obj,characteristic_setMostSiguuid,uuid_msb(characteristic->uuid));env->CallVoidMethod(characteristic_obj,characteristic_setLeastSiguuid,uuid_lsb(characteristic->uuid));env->CallVoidMethod(characteristic_obj,characteristic_setValue,NULL);env->CallVoidMethod(characteristic_obj,characteristic_setDescriptor,descriptor_arraylist);env->CallBooleanMethod(characteristic_arraylist, arraylist_add, characteristic_obj);}jobject service_obj = env->NewObject(service_cls,service_init,"");env->CallVoidMethod(service_obj,service_setService_type,service->service_type);env->CallVoidMethod(service_obj,service_setMostSiguuid,uuid_msb(service->uuid));env->CallVoidMethod(service_obj,service_setLeastSiguuid,uuid_lsb(service->uuid));env->CallVoidMethod(service_obj,service_setHandle,service->handle);env->CallVoidMethod(service_obj,service_setEnd_group_handle,service->end_group_handle);env->CallVoidMethod(service_obj,service_setCharacteristic,characteristic_arraylist);env->CallBooleanMethod(service_arraylist, arraylist_add, service_obj);}ANW_LOGI("--- GATT_GetService ---");return service_arraylist;
}

这篇关于android O 32位系统报错:JNI DETECTED ERROR IN APPLICATION: use of deleted local reference的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/699884

相关文章

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

Java报错:org.springframework.beans.factory.BeanCreationException的五种解决方法

《Java报错:org.springframework.beans.factory.BeanCreationException的五种解决方法》本文解析Spring框架中BeanCreationExce... 目录引言一、问题描述1.1 报错示例假设我们有一个简单的Java类,代表一个用户信息的实体类:然后,

Linux查询服务器系统版本号的多种方法

《Linux查询服务器系统版本号的多种方法》在Linux系统管理和维护工作中,了解当前操作系统的版本信息是最基础也是最重要的操作之一,系统版本不仅关系到软件兼容性、安全更新策略,还直接影响到故障排查和... 目录一、引言:系统版本查询的重要性二、基础命令解析:cat /etc/Centos-release详

Spring Boot项目如何使用外部application.yml配置文件启动JAR包

《SpringBoot项目如何使用外部application.yml配置文件启动JAR包》文章介绍了SpringBoot项目通过指定外部application.yml配置文件启动JAR包的方法,包括... 目录Spring Boot项目中使用外部application.yml配置文件启动JAR包一、基本原理

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按