cantk-runtime中直接使用的webview,通过JAVA扩展接口把Canvas的2d Context的API定向到JNI,通过OpenGL来图形加速,渲染速度大大提高。后来测试发现在大部分手机上都很正常,但是在有的老手机上速度不稳定,出现突然卡顿的情况。经过研究发现原因是老版本的webkit里没有requestAnimationFrame这个接口(或类似接口),用setTimeout来模拟的requestAnimationFrame非常不稳定。

为了解决这个问题,我们决定像其它Runtime一样集成Google V8 JS引擎,自己模拟一个webview出来。架构也相当简单,上面用GLSurfaceView,在JNI里使用Google V8 JS引擎来JS代码,在onDrawFrame里去执行requestAnimationFrame注册的函数,经过测试性能相当稳定。

Google V8 JS引擎在缺省情况下用起来非常顺手,它自带的例子拿来就可以用,比如:

int main(int argc, char* argv[]) {
v8::V8::InitializeICU();
v8::Platform* platform = v8::platform::CreateDefaultPlatform();
v8::V8::InitializePlatform(platform);
v8::V8::Initialize();
v8::V8::SetFlagsFromCommandLine(&argc, argv, true);
ShellArrayBufferAllocator array_buffer_allocator;
v8::V8::SetArrayBufferAllocator(&array_buffer_allocator);
v8::Isolate* isolate = v8::Isolate::New();
run_shell = (argc == 1);
int result;
{
v8::Isolate::Scope isolate_scope(isolate);
v8::HandleScope handle_scope(isolate);
v8::Handle<v8::Context> context = CreateShellContext(isolate);
if (context.IsEmpty()) {
fprintf(stderr, "Error creating context\n");
return 1;
}
v8::Context::Scope context_scope(context);
result = RunMain(isolate, argc, argv);
if (run_shell) RunShell(context);
}
v8::V8::Dispose();
v8::V8::ShutdownPlatform();
delete platform;
return result;
}

但是我需要在onSurfaceCreated做初始化的工作,在onDrawFrame里去执行JS。一个看似简单的改东却遇到了麻烦:Isolate::GetCurrent()返回值为空。第一次接触V8,对里面的概念理解不深,以为Isolate::Scope和HandleScope一样,在作用范围结束时释放Isolate,我希望onSurfaceCreated调用完成后Isolate对象还活着,在onDrawFrame还可以使用,所以去掉v8::Isolate::Scope isolate_scope(isolate)这行代码,但是结果Isolate::GetCurrent()返回值还是为空。

网上没有找到类似的应用场景,于是去看V8的代码。发现Isolate::Scope的功能并不是想的那样。在Isolate::Scope的构造函数里调用Isolate::Enter把参数指定的isolate设置成当前的isolate(放在线程局部存储里的),在Isolate::Scope的析构函数调用Isolate::Exit恢复前一个isolate。只有在这个范围内Isolate::GetCurrent()才有效。

知道原理后,修改很简单了:直接调用Isolate::Enter。

cantk-runtime v8版本目前还不完善,不过欢迎大家加星:)

在Android上使用Google V8 JS 引擎的更多相关文章

  1. 用NAN简化Google V8 JS引擎的扩展

    通过C++扩展Google V8 JS引擎的文章很多,Google V8 JS带的例子也容易明白.但是大部分文章都是Hello World型的,真正使用时发现处处是坑.扩展V8最经典的例子就是node ...

  2. [原创]Windows下Google V8 javascript引擎编译

    项目用到将v8嵌入到C++的情况,公司没时间研究,只有在家研究,编译过程一堆坑.记录一下. 网上百度的都是基于vs2010,或者早版本的v8编译,最新版本应该使用vs2013\vs2015.本文介绍的 ...

  3. QML和JS引擎的关系以及调用c++函数的原理

    首先推荐几篇博客 1.深入解析QML引擎, 第1部分:QML文件加载 https://www.cnblogs.com/wzxNote/p/10569535.html 2.深入解析QML引擎, 第2部分 ...

  4. 判断js引擎是javascriptCore或者v8

    来由   纯粹的无聊,一直在搜索JavaScriptCore和SpiderMonkey的一些信息,却无意中学习了如何在ios的UIWebView中判断其js解析引擎的方法: if (window.de ...

  5. Google V8 引擎 原理详解

    V8 引擎概览 V8 引擎简介 Google V8 引擎使用 C++ 代码编写,实现了 ECMAScript 规范的第五版,可以运行在所有的主流 操作系统中,甚至可以运行在移动终端 ( 基于 ARM ...

  6. 深入浏览器工作原理和JS引擎(V8引擎为例)

    浏览器工作原理和JS引擎 1.浏览器工作原理 在浏览器中输入查找内容,浏览器是怎样将页面加载出来的?以及JavaScript代码在浏览器中是如何被执行的? 大概流程可观察以下图: 首先,用户在浏览器搜 ...

  7. Google V8编程详解(五)JS调用C++

    http://blog.csdn.net/feiyinzilgd/article/details/8453230 最近由于忙着解决个人单身的问题,时隔这么久才更新第五章. 上一章主要讲了Google ...

  8. google v8引擎常见问题

    最近在项目中使用v8来进行扩展,下面简单说一下使用v8过程中遇到的一些问题.   v8的多线程调用 最初调研v8的测试代码是单线程的,后来一个项目在多线程中使用,出现了一些问题,后来看到参考3中的才恍 ...

  9. android sdk manager 无法更新,解决连不上dl.google.com的问题

    感谢博主的帮助,入口在这:https://www.jianshu.com/p/8fb367a51b9f?utm_campaign=haruki&utm_content=note&utm ...

随机推荐

  1. 2016 Al-Baath University Training Camp Contest-1 A

    Description Tourist likes competitive programming and he has his own Codeforces account. He particip ...

  2. Android LayoutInflater原理分析

    相信接触Android久一点的朋友对于LayoutInflater一定不会陌生,都会知道它主要是用于加载布局的.而刚接触Android的朋友可能对LayoutInflater不怎么熟悉,因为加载布局的 ...

  3. vs自带iis局域网调试

    http://www.cnblogs.com/liluping860122/p/4685564.html

  4. MUI 个推

    个推 四种消息模板(透传消息模板.点击通知打开网页模板.点击通知打开应用模板.点击通知栏弹框下载模版) 三种推送方式(对单个用户推送接口 | 对指定用户列表推送接口 | 对指定应用群推接口) 四种消息 ...

  5. Infragistics UltraGrid的使用

    OL SDK:http://help.infragistics.com/ 资料参考:http://blog.csdn.net/andy_212/article/details/4019895 http ...

  6. JLINK使用教程详解,以及与JTAG区别

    对于一个新手来说,一切都不容易. 而从头学起也是一件非常美好的事. 观看     调试ARM,要遵循ARM的调试接口协议,JTAG就是其中的一种.当仿真时,IAR.KEIL.ADS等都有一个公共的调试 ...

  7. Struts2的输入校验(2)——客户端校验

    Struts2的输入校验(2) --客户端校验 Struts2客户端校验的使用: (1)使用Struts2的标签生成输入页面的表单: (2)为该<s:form>元素添加validate=& ...

  8. 创立数据库表 examstudent

    package com.hanqi.test; import java.sql.*; import java.util.*; public class LianXi { public static v ...

  9. Cheatsheet: 2013 08.01 ~ 08.13

    Mobile Objective C Blocks: Summary, Syntax & Best Practices Android SDK: Create an Arithmetic Ga ...

  10. RNAseq分析软件STAR的安装

    wget https://github.com/alexdobin/STAR/releases/STAR-2.5.2a.tar.gz tar -xzf STAR-2.5.2a.tar.gz cd ST ...