У меня есть объект, который используется для вызова функций обратного вызова:
static jobject o;
Я назначил функцию обратного вызова этому объекту через указатель:
o=env->NewGlobalRef(callback);
Тот же указатель,env
указывает на функцию CallVoidMethod
, которая использует JNI для доступа к Java-коду.
env->CallVoidMethod(o, methodId, pDeviceId, deviceStatus, statusReason, connectionProgressInfo);
Однако при вызове этой функции происходит сбой системы, и VM говорит, что это недопустимая ссылкак статическому заданию o, а затем происходит сбой.
Мой код выглядит следующим образом:
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 </p>
W / dalvikvm (1673): в Ldalvik / system / NativeStart; .run () V (CallVoidMethodV)
I /dalvikvm (1673): "Thread-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 nice = 0 sched = 0/0 cgrp = неизвестный дескриптор = 3194272
Пожалуйста, помогите мне