Android jni не использовать одноэлементный режим - PullRequest
0 голосов
/ 18 июня 2020

У меня есть класс с именем FJpegStreamReader, который загрузил jni (.so):

System.loadLibrary("fjpeg");

и имеет конструктор singleton:

 private static volatile FJpegStreamReader mInstances;
    public static FJpegStreamReader getInstance() {
        if (mInstances == null) {
            synchronized (FJpegStreamReader.class) {
                if (mInstances == null) {
                    mInstances = new FJpegStreamReader();
                }
            }
        }
        return mInstances;
    }

, когда я его вызываю с синглтоном он работает хорошо,

FJpegStreamReader.getInstance().open("/sdcard/markers.jpg", FJpeg.MODEL_OPEN);

Но теперь я не хочу использовать одноэлементный режим, я пытаюсь изменить FJpegStreamReader и вызываю его следующим образом:

FJpegStreamReader readerA = new FJpegStreamReader();
FJpegStreamReader readerB = new FJpegStreamReader();
readerA.open("/sdcard/markers1.jpg", FJpeg.MODEL_OPEN);
readerB.open("/sdcard/markers2.jpg", FJpeg.MODEL_OPEN);
Bitmap bmA = readerA.getBackgroundImage();
Bitmap bmB = readerB.getBackgroundImage();

и readerA работает хорошо, а readerB выходит из строя. Я хочу, чтобы он мог быть инстансирован более одного раза в одно и то же время, как заставить работать эти readerA и readerB?

25884-25884 I: JNI_OnLoad Called
25884-25884 I: FilePath: /sdcard/markers1.jpg, and OpenMode: 0
25884-25884 I: offset is:15079
25884-25884 I: Start to Parser Data
25884-25884 I: Open Succeed
25884-25884 I: FilePath: /sdcard/markers2.jpg, and OpenMode: 0
25884-25884 E: Fired to Open File(code: -1001)

Это мой c++ метод:

unique_ptr<FJpeg> f(new FJpeg);

static jboolean
FJpeg_open(JNIEnv *env, jobject thiz, jstring fileName, jint model) {
    const char *c_path = NULL;
    c_path = env->GetStringUTFChars(fileName, NULL);
    LOG_I("FilePath: %s, and OpenMode: %d", c_path, model);
    int rel = f->openFile(c_path, model);
    if (rel < 0) {
        LOG_E("Fired to Open File(code: %d)", rel);
        return false;
    }
    LOG_I("Open Succeed");
    return true;
}

...

int FJpeg::openFile() {
    if (file_path == NULL || *file_path == '\0' || (open_mode != 0 && open_mode != 1)) return ERROR_CODE_UNSUPPORTED_OPERAND;
    if (open_mode == 0) {
        f_in.open(file_path, ios::in | ios::binary);
        if (f_in.fail()) return ERROR_CODE_FILE_NOT_FOUND;
        return checkOffsetAndEnd();
    } else {
        f_out.open(file_path, ios::out | ios::binary);
        if (f_out.fail()) return ERROR_CODE_FILE_NOT_FOUND;
        return 0;
    }
}

1 Ответ

0 голосов
/ 18 июня 2020

Похоже, что все ваши объекты Java FJpegStreamReader совместно используют один объект c ++ FJpeg.

Вам нужно будет изменить это, чтобы связать каждый объект Java с уникальным объектом FJpeg, например, путем сохранения либо необработанный адрес в длинном поле в классе Java или его дескриптор и преобразование обоих обратно в указатель в ваших методах Jni.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...