у меня есть объект, который используется для вызова функции обратного вызова:Недопустимая ссылки во время обратного вызова
static jobject o;
я назначенный функцию обратного вызова для этого объекта через указатель:
o=env->NewGlobalRef(callback);
Тот же указатель, env
, указывает на функцию CallVoidMethod
, которая использует JNI для доступа к Java-коду.
env->CallVoidMethod(o, methodId, pDeviceId, deviceStatus, statusReason, connectionProgressInfo);
Однако при вызове этой функции, система становится разбилась, и VM говорит, что это недопустимая ссылка на статический jobject о и затем он выходит из строя.
Мой код выглядит следующим образом:
static jint android_net_wimax_subscribeDeviceStatusChange(JNIE nv* env, jobject clazz, jobject jdeviceId, jobject callback)
{
// LOGD(" android_net_wimax_subscribeDeviceStatusChange() ->D1");
o = env->NewGlobalRef(callback);
//o = callback;
// LOGD(" android_net_wimax_subscribeDeviceStatusChange() ->D2");
return (jint)::SubscribeDeviceStatusChange(deviceId, fun_IndDeviceStatusUpdate);
}
void fun_IndDeviceStatusUpdate(WIMAX_API_DEVICE_ID_P pDeviceId, WIMAX_API_DEVICE_STATUS deviceStatus,
WIMAX_API_STATUS_REASON statusReason, WIMAX_API_CONNECTION_PROGRESS_INFO connectionProgressInfo)
{
JNIEnv *env = NULL;
int nResult = -1;
// LOGD(" AttachCurrentThread() ->D1");
nResult = g_jVM->AttachCurrentThread(&env, NULL);
// LOGD(" AttachCurrentThread() ->D2-%d",nResult);
if ((nResult != 0) || (env == NULL))
{
LOGD(" AttachCurrentThread() failed");
}
else
{
// LOGD(" AttachCurrentThread() ->D3");
if(o == NULL)
{
LOGD(" o is NULL ");
}
else
{
LOGD(" o is not NULL ");
}
jclass cls = env->GetObjectClass(o);
// LOGD(" AttachCurrentThread() ->D4");
jmethodID methodId = env->GetMethodID(cls, "callback", "(Landroid/net/wimax/structs/DeviceId;III)V");
// LOGD(" AttachCurrentThread() failed->D5");
if (methodId) {
env->CallVoidMethod(o, methodId, pDeviceId, deviceStatus, statusReason, connectionProgressInfo);
}
if (g_jVM->DetachCurrentThread() != JNI_OK) {
LOGE("%s: DetachCurrentThread() failed", __FUNCTION__);
}
}
// LOGD("JNI->CALLBACK->D3");
}
< < < D/WiMax (только 1673): перед тем CallVoidMethod() W/dalvikvm (1673): JNI ВНИМАНИЕ: 0x48e31dec не является допустимым ссылка JNI
Вт/dalvikvm (1673): в Ldalvik/системы/NativeStart; .run() V (CallVoidMethodV)
I/dalvikvm (1673): "резьба-55" PRIO = 5 TID = 45 Runnable
I/dalvikvm (1673): | group = "main" sCount = 0 dsCount = 0 s = N obj = 0x43b6c930 self = 0x306370
I/dalvikvm (1673): | sysTid = 2000 приятно = 0 Плановое = 0/0 КГП = неизвестная ручка = 3194272
Пожалуйста, помогите мне
эй фадден, я добавил код. любезно взгляните на него. – dapper
Я все еще не вижу этого. Вы говорите о создании глобального ref для «callback», называемого «o», но вызов CallVoidMethod, который терпит неудачу, не использует ни один из них. Один или несколько из «pDeviceId», «deviceStatus», «statusReason» или «connectionProgressInfo» являются плохими.Добавьте сообщение журнала, которое выводит все четыре в виде шестнадцатеричного («% p») над CallVoidMethod и показывает, какой из них соответствует значению, указанному в строке JNI WARNING. – fadden
hi fadden, я добавил полный исходный код, может быть, теперь у вас может быть четкое понимание. – dapper