ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-09-06 10:01:54  阅读:283  来源: 互联网

标签:use reference service characteristic arraylist descriptor 报错 env cls


一、同样的程序我在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;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public 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>() {
        @Override
        public AnWBT_BLE_Service createFromParcel(Parcel in) {
            return new AnWBT_BLE_Service(in);
        }

        @Override
        public 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;
}

标签:use,reference,service,characteristic,arraylist,descriptor,报错,env,cls
来源: https://blog.csdn.net/sui1005316018/article/details/120127379

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有