Project configuration
This post series will be an intro to embedding v8 in Android. The first step would be to have v8 compiled as static or shared libraries for arm/arm64. I invite you to see my other posts v8.
Then, configure your project’s .mk file. Depending on your v8 compilation type, you got libraries for snapshot, no snapshot, or external snapshot. Currently, snapshots are compiled by default. These snapshots will contain base objects, like for example, Math. There’s no runtime difference among them, just different initialization times. In my nexus 5x, no snapshot takes around 400ms to initialize an Isolate and a Context, and around 30 with snapshot. The external snapshot and snapshot differ in that the external snapshot must be explicitly loaded (.bin files in the compilation output), and snapshot library is a static lib file of roughly 1Mb in size, that will be linked with the final .so file binary instead of externally loaded. Bear in mind that snapshot libs, internal or external, would require you to supply some extra native code for reading the Natives (.bin) files.
For simplicity, we’ll use no snapshot library.
Android.mk
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := libv8_base LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libv8_base.a include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libv8_libbase LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libv8_libbase.a include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libv8_libplatform LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libv8_libplatform.a include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libv8_nosnapshot LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libv8_nosnapshot.a include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libv8_libsampler LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libv8_libsampler.a include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_C_INCLUDES := $(LOCAL_PATH)/include LOCAL_CFLAGS := -std=c++11 # libraries in order. LOCAL_STATIC_LIBRARIES := v8_base v8_libplatform v8_libbase v8_libsampler v8_snapshot LOCAL_MODULE := v8 LOCAL_SRC_FILES := <your c/c++ files> LOCAL_LDLIBS := -llog -landroid include $(BUILD_SHARED_LIBRARY)
TARGET_ARCH_ABI
is a predefined variable in Gradle that identifies the build flavour.LOCAL_C_INCLUDES
will point to a directory where all v8 compilation resulting header files will be set.
The Application.mk file is trivial:
APP_STL := c++_static APP_PLATFORM := android-14 APP_ABI := armeabi-v7a
The directory structure should be something like this:

The armeabi-v7a folder should contain the static or shader v8 library files.
Lastly, add a product flavour
to your build.gradle file, by adding to its android
section:
productFlavors { create("arm7") { ndk { abiFilters = ["armeabi-v7a"] } } }
With this, you should be able to compile an android app with v8 embedded. Next post will be to instantiate an Isolate
, creating and setting a main execution Context
, and setting a global exception handler
, basic elements to have embedded javascript running in your Android application.