Я получил cra sh при вызове OnProgress () несколько раз в потоке c. JNIEnv, объект обратного вызова, methodId находятся в глобальной структуре.
обратный вызов:
static void OnProgress(int percent, char *msg) {
jstring str = (*g_upgrade_cb.env)->NewStringUTF(g_upgrade_cb.env, msg);
(*g_upgrade_cb.env)->CallObjectMethod(g_upgrade_cb.env, g_upgrade_cb.callback,
g_upgrade_cb.onprogress, percent, str);
(*g_upgrade_cb.env)->DeleteLocalRef(g_upgrade_cb.env, str);
}
вызовите функцию следующим образом:
char str[512];
sprintf(str, "F/W: %.3d %.4d-%.2d-%.2d %ld bytes\n",
version, fw_year, fw_month, fw_day, image_size);
OnProgress(0, str);
g_upgrade_cb:
typedef struct {
jobject callback;
jmethodID onprogress;
JNIEnv *env;
} JniCallBack;
JniCallBack g_upgrade_cb = {};
pthread_create(&g_tid, NULL, UpgradeThread, (void *) callback);
void *UpgradeThread(void *arg) {
JNIEnv *env;
int envState = (*g_jvm)->GetEnv(g_jvm, (void **) &env, JNI_VERSION_1_6);
if (envState == JNI_EDETACHED) {
if ((*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL) != 0) {
return NULL;
}
}
g_upgrade_cb.env = env;
g_upgrade_cb.callback = (jobject) arg;
jclass jclazz = (*env)->GetObjectClass(env, g_upgrade_cb.callback);
if (jclazz == 0) {
LOGD("Unable to find class");
(*g_jvm)->DetachCurrentThread(g_jvm);
return NULL;
}
jmethodID onprogress = (*env)->GetMethodID(env, jclazz, "onProcess",
"(ILjava/lang/String;)V");
g_upgrade_cb.onprogress = onprogress;
LOGD("-------start upgrade-----");
OnProgress(0, "start upgrade");
OnProgress(0, "end upgrade");
LOGD("-------end upgrade-----");
......
}
Может ли кто-нибудь помочь мне? Thks!