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 回答