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

相关文章

解决idea启动项目报错java: OutOfMemoryError: insufficient memory

《解决idea启动项目报错java:OutOfMemoryError:insufficientmemory》:本文主要介绍解决idea启动项目报错java:OutOfMemoryError... 目录原因:解决:总结 原因:在Java中遇到OutOfMemoryError: insufficient me

Android使用java实现网络连通性检查详解

《Android使用java实现网络连通性检查详解》这篇文章主要为大家详细介绍了Android使用java实现网络连通性检查的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录NetCheck.Java(可直接拷贝)使用示例(Activity/Fragment 内)权限要求

2025最新版Android Studio安装及组件配置教程(SDK、JDK、Gradle)

《2025最新版AndroidStudio安装及组件配置教程(SDK、JDK、Gradle)》:本文主要介绍2025最新版AndroidStudio安装及组件配置(SDK、JDK、Gradle... 目录原生 android 简介Android Studio必备组件一、Android Studio安装二、A

C++简单日志系统实现代码示例

《C++简单日志系统实现代码示例》日志系统是成熟软件中的一个重要组成部分,其记录软件的使用和运行行为,方便事后进行故障分析、数据统计等,:本文主要介绍C++简单日志系统实现的相关资料,文中通过代码... 目录前言Util.hppLevel.hppLogMsg.hppFormat.hppSink.hppBuf

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

idea突然报错Malformed \uxxxx encoding问题及解决

《idea突然报错Malformeduxxxxencoding问题及解决》Maven项目在切换Git分支时报错,提示project元素为描述符根元素,解决方法:删除Maven仓库中的resolv... 目www.chinasem.cn录问题解决方式总结问题idea 上的 maven China编程项目突然报错,是

linux系统中java的cacerts的优先级详解

《linux系统中java的cacerts的优先级详解》文章讲解了Java信任库(cacerts)的优先级与管理方式,指出JDK自带的cacerts默认优先级更高,系统级cacerts需手动同步或显式... 目录Java 默认使用哪个?如何检查当前使用的信任库?简要了解Java的信任库总结了解 Java 信

Oracle数据库在windows系统上重启步骤

《Oracle数据库在windows系统上重启步骤》有时候在服务中重启了oracle之后,数据库并不能正常访问,下面:本文主要介绍Oracle数据库在windows系统上重启的相关资料,文中通过代... oracle数据库在Windows上重启的方法我这里是使用oracle自带的sqlplus工具实现的方

linux查找java项目日志查找报错信息方式

《linux查找java项目日志查找报错信息方式》日志查找定位步骤:进入项目,用tail-f实时跟踪日志,tail-n1000查看末尾1000行,grep搜索关键词或时间,vim内精准查找并高亮定位,... 目录日志查找定位在当前文件里找到报错消息总结日志查找定位1.cd 进入项目2.正常日志 和错误日

Android实现图片浏览功能的示例详解(附带源码)

《Android实现图片浏览功能的示例详解(附带源码)》在许多应用中,都需要展示图片并支持用户进行浏览,本文主要为大家介绍了如何通过Android实现图片浏览功能,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码