其他分享
首页 > 其他分享> > 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;
    }

    @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