1

バックグラウンド スレッドから Android アプリケーションの JNI 呼び出しから v8 を呼び出そうとしています。v8::ObjectTemplate::New(v8::Handle に関する苦情でランタイム クラッシュを引き起こしています。

再現するには、次の 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();
    }

UIスレッドまたはランナブルから関数を直接呼び出すと、機能します。

何か案は?

4

1 に答える 1

0

問題は、Isolate を生成するコードが欠落していることです。

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();
}
于 2013-06-28T14:03:18.587 に答える