2013-06-26 4 views
1

Я пытаюсь вызвать v8 из вызова JNI в приложении Android из фонового потока. Это вызывает сбой во время выполнения с жалобой на v8 :: ObjectTemplate :: Новая (v8 :: Handlev8 на фоновом потоке в Android JNI

воспроизвести вызвать следующую JNI

void JSfunc() { 
     v8::Isolate* currentIsolate = v8::Isolate::GetCurrent(); 
     if(!currentIsolate) { 
      currentIsolate = v8::Isolate::New(); 
     } 
     v8::HandleScope handle_scope(currentIsolate); 
     v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New(); 
    } 

из следующего кода Java

{ 
    final Thread loadJS = new Thread() { 
     @Override 
     public void run() { 
      JSfunc()); 
     } 
    }; 
    loadJS.start(); 
    } 

При вызове функции непосредственно из потока пользовательского интерфейса или исполняемого он работает.

идей?

+0

Если вы врезаться там, я думаю, мы вправе предположить, что в фрагмент jni-кода, который вы оставили взамен длинной декларации заголовка JNI JSFunc для нашей выгоды? (Не обвиняйте вас ...) – Tom

+0

Да, я пропустил extern «C» {JNIEXPORT void Java_com_example_app_class_JSfunc (JNIEnv * env, jobject thiz) {JSfunc(); }} – navillus

+0

Отлично. Сложно... – Tom

ответ

0

Проблема заключается в том, что код для генерации Изолировать отсутствует

currentIsolate->Enter(); 

поэтому правильная функция JNI является

void JSfunc() { 
    v8::Isolate* currentIsolate = v8::Isolate::GetCurrent(); 
    if(!currentIsolate) { 
     currentIsolate = v8::Isolate::New(); 
     currentIsolate->Enter(); 
    } 
    v8::HandleScope handle_scope(currentIsolate); 
    v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New(); 
}