Прерывание виртуальной машины при создании двух потоков в приложении для Android - PullRequest
0 голосов
/ 28 ноября 2011

Я создал один поток для вызова нативной функции, которая вызывает кодек MPEG2, который разработан на C. И callback_handler вызывает функцию java для предоставления фрейма изображения, а обработчик отображает фреймы в представлении изображения. И это работает нормально. но когда я пытаюсь создать два потока для вызова собственной функции для каждого потока и отображения двух видео. Я создал два обработчика для каждого потока. но когда я запустил приложение, оно вызывает собственные методы два раза, но после выполнения некоторой функции я получаю ошибку VM Aborting . Я искал эту проблему. И я обнаружил, что один JNIEnv может иметь только один поток. И для этого мы должны зарегистрировать поток JNIEnv в JavaVM. В callback_handler я делаю это с помощью этой функции

JNIEnv *env = RegisterWithVM(&jvm);
    if((NULL == env) || (NULL == jvm))
    {
        __android_log_print(ANDROID_LOG_INFO,"JNI", "callback_handler call failed\n");
        return;
    }

И я также пытался связать текущий Thread Enviroment с JavaVM в собственной функции JNi, используя этот код.

gJavaVM->GetEnv((void**) &env, JNI_VERSION_1_6);
gJavaVM->AttachCurrentThread(&env, NULL);

Но после использования я получаю эту ошибку.

11-28 16:40:23.430: I/JNI(323): Loaded
11-28 16:40:23.430: I/JNI(323): Find the class
11-28 16:40:23.430: I/JNI(323): Registered...
11-28 16:40:23.430: I/JNI(323): Version...65540
11-28 16:40:23.440: I/JNI(323): CallDecoding function of thread is called
11-28 16:40:23.451: I/JNI(323): StartDecoding function is called
11-28 16:40:23.451: W/dalvikvm(323): JNI WARNING: threadid=7 using env from threadid=8
11-28 16:40:23.451: W/dalvikvm(323):              in Lcom/example/Internet_TV12;.CallDecoding1 (ILjava/lang/Object;)V (NewByteArray)
11-28 16:40:23.451: I/dalvikvm(323): "Thread-8" prio=5 tid=7 NATIVE
11-28 16:40:23.451: I/dalvikvm(323):   | group="main" sCount=0 dsCount=0 s=N obj=0x44ee97f0 self=0x131cc0
11-28 16:40:23.470: I/JNI(323): CallDecoding function of thread is called
11-28 16:40:23.470: I/JNI(323): In JNI interface image file opened 
11-28 16:40:23.470: I/JNI(323): StartDecoding function is called

11-28 16:40:23.499: I/dalvikvm(323):   | sysTid=331 nice=0 sched=0/0 cgrp=default handle=1153704
11-28 16:40:23.499: I/dalvikvm(323):   | schedstat=( 28746111 138980250 15 )
11-28 16:40:23.499: I/dalvikvm(323):   at com.example.Internet_TV12.CallDecoding1(Native Method)
11-28 16:40:23.499: I/dalvikvm(323):   at com.example.Internet_TV12$4.run(Internet_TV12.java:57)
11-28 16:40:23.499: I/dalvikvm(323):   at java.lang.Thread.run(Thread.java:1096)
11-28 16:40:23.499: E/dalvikvm(323): VM aborting

Может ли какой-нибудь орган помочь мне решить эту проблему ...

Заранее спасибо

1 Ответ

0 голосов
/ 29 ноября 2011

Кажется, вы перезаписали свою переменную env, а затем снова использовали ее в другом потоке.

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