【问题标题】:v8 on a background thread in Android JNIAndroid JNI 中后台线程上的 v8
【发布时间】:2013-06-26 16:53:40
【问题描述】:

我正在尝试从后台线程的 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 线程或可运行对象调用该函数,则它可以工作。

有什么想法吗?

【问题讨论】:

  • 如果你崩溃了,我想我们假设在 jni 代码 sn-p 中你为了我们的利益省略了 JSFunc 的长 JNI 标头声明是正确的? (别怪你……)
  • 是的,我错过了 extern "C" { JNIEXPORT void Java_com_example_app_class_JSfunc( JNIEnv* env, jobject thiz ) { JSfunc(); } }

标签: java android java-native-interface v8 libv8


【解决方案1】:

问题是缺少生成 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();
}

【讨论】:

    猜你喜欢
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    • 2017-11-26
    • 2011-02-14
    相关资源
    最近更新 更多