Cra sh ошибка: ОШИБКА JNI: переполнение локальной справочной таблицы (макс. = 512) - PullRequest
0 голосов
/ 10 января 2020

Я получил 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!

...