Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 58 additions & 0 deletions .github/workflows/build-android-quickjs-minimal.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
name: Build Android QuickJS Minimal AAR

on:
workflow_call:

env:
NDK_VERSION: '28.2.13676358'

jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 45
steps:
- uses: actions/checkout@v5

- uses: actions/setup-java@v5
with:
distribution: temurin
java-version: '17'

- name: Build AAR (release / MinSizeRel)
working-directory: Install/AndroidQuickJSMinimal
run: |
chmod +x gradlew
./gradlew :BabylonNative:assembleRelease \
-PNDK_VERSION=${{ env.NDK_VERSION }}

- name: Print artifact sizes
working-directory: Install/AndroidQuickJSMinimal
run: |
AAR=BabylonNative/build/outputs/aar/BabylonNative-release.aar
if [ ! -f "$AAR" ]; then
echo "::error::AAR not found at $AAR"
exit 1
fi

echo "==> Artifact sizes"
AAR_BYTES=$(stat -c%s "$AAR")
AAR_MB=$(awk "BEGIN { printf \"%.2f\", $AAR_BYTES / 1048576 }")
printf 'AAR : %12d bytes (%6s MB) %s\n' "$AAR_BYTES" "$AAR_MB" "$AAR"

# Extract and report each libBabylonNativeJNI.so size
TMP=$(mktemp -d)
unzip -q "$AAR" "jni/*/libBabylonNativeJNI.so" -d "$TMP"
find "$TMP/jni" -name 'libBabylonNativeJNI.so' | sort | while read SO; do
REL=${SO#$TMP/}
SO_BYTES=$(stat -c%s "$SO")
SO_MB=$(awk "BEGIN { printf \"%.2f\", $SO_BYTES / 1048576 }")
printf ' - %-50s %12d bytes (%6s MB)\n' "$REL" "$SO_BYTES" "$SO_MB"
done
rm -rf "$TMP"

- name: Upload AAR
uses: actions/upload-artifact@v4
with:
name: BabylonNative-QuickJSMinimal-release-aar
path: Install/AndroidQuickJSMinimal/BabylonNative/build/outputs/aar/BabylonNative-release.aar
if-no-files-found: error
4 changes: 4 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,10 @@ jobs:
runs-on: macos-latest
js-engine: V8

# ── Android QuickJS minimal AAR (publishable, MinSizeRel) ────
Android_QuickJSMinimal:
uses: ./.github/workflows/build-android-quickjs-minimal.yml

# ── Installation Tests ────────────────────────────────────────
iOS_Installation:
uses: ./.github/workflows/test-install-ios.yml
Expand Down
4 changes: 2 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,8 @@ FetchContent_Declare(ios-cmake
GIT_TAG 4.5.0
EXCLUDE_FROM_ALL)
FetchContent_Declare(JsRuntimeHost
GIT_REPOSITORY https://github.com/BabylonJS/JsRuntimeHost.git
GIT_TAG 808601482588b7f806d91231288310b94766dc84)
GIT_REPOSITORY https://github.com/CedricGuillemet/JsRuntimeHost.git
GIT_TAG fe26c61ecdebf84e8617c234b1729b86b1650858)
FetchContent_Declare(libwebp
GIT_REPOSITORY https://github.com/webmproject/libwebp.git
GIT_TAG 57e324e2eb99be46df46d77b65705e34a7ae616c
Expand Down
10 changes: 10 additions & 0 deletions Install/AndroidQuickJSMinimal/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Build outputs
build/
.cxx/
.gradle/
local.properties
*.iml
.idea/

# AAR build staging (out-of-tree)
../../Build/Android-QuickJSMinimal/
3 changes: 3 additions & 0 deletions Install/AndroidQuickJSMinimal/BabylonNative/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
/build
*.iml
.cxx/
31 changes: 31 additions & 0 deletions Install/AndroidQuickJSMinimal/BabylonNative/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
cmake_minimum_required(VERSION 3.18)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

project(BabylonNativeQuickJSMinimal)

# Repo root: Install/AndroidQuickJSMinimal/BabylonNative/../../..
get_filename_component(REPO_ROOT_DIR "${CMAKE_CURRENT_LIST_DIR}/../../.." ABSOLUTE)

add_subdirectory(${REPO_ROOT_DIR} "${CMAKE_CURRENT_BINARY_DIR}/BabylonNative")

add_library(BabylonNativeJNI SHARED
src/main/cpp/BabylonNativeJNI.cpp)

target_link_libraries(BabylonNativeJNI
PRIVATE GLESv3
PRIVATE android
PRIVATE EGL
PRIVATE log
PRIVATE -lz
PRIVATE AndroidExtensions
PRIVATE AppRuntime
PRIVATE Blob
PRIVATE Console
PRIVATE GraphicsDevice
PRIVATE NativeEngine
PRIVATE Performance
PRIVATE ScriptLoader
PRIVATE ShaderCache
PRIVATE Window)
75 changes: 75 additions & 0 deletions Install/AndroidQuickJSMinimal/BabylonNative/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
plugins {
id 'com.android.library'
}

def jsEngine = "QuickJS"
if (project.hasProperty("jsEngine")) {
jsEngine = project.property("jsEngine")
}

def graphics_api = "OpenGL"
if (project.hasProperty("GRAPHICS_API")) {
graphics_api = project.property("GRAPHICS_API")
}

android {
namespace = 'com.library.babylonnative'
compileSdk = 34

defaultConfig {
minSdk = 25

consumerProguardFiles "consumer-rules.pro"
ndkVersion = "29.0.14206865"
if (project.hasProperty("NDK_VERSION")) {
ndkVersion = project.property("NDK_VERSION")
}
externalNativeBuild {
cmake {
abiFilters "arm64-v8a", "x86_64"
arguments "-DANDROID_STL=c++_static",
"-DENABLE_PCH=OFF",
"-DGRAPHICS_API=${graphics_api}",
"-DNAPI_JAVASCRIPT_ENGINE=${jsEngine}",
"-DBABYLON_NATIVE_BUILD_APPS=OFF",
"-DBABYLON_DEBUG_TRACE=ON",
"-DBABYLON_NATIVE_PLUGIN_NATIVEENGINE_LOAD_IMAGES=OFF",
"-DBABYLON_NATIVE_PLUGIN_SHADERCOMPILER=OFF",
"-DBABYLON_NATIVE_PLUGIN_NATIVEENGINE_COMPILESHADERS=OFF"
cppFlags += ["-Wno-deprecated-literal-operator"]
}
}
ndk {
abiFilters "arm64-v8a", "x86_64"
}
}

externalNativeBuild {
cmake {
version = '3.19.6+'
path = 'CMakeLists.txt'
buildStagingDirectory = "../../../Build/Android-QuickJSMinimal"
}
}

buildTypes {
release {
minifyEnabled = false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
externalNativeBuild {
cmake {
arguments "-DCMAKE_BUILD_TYPE=MinSizeRel",
"-DCMAKE_C_FLAGS_MINSIZEREL=-Os -DNDEBUG",
"-DCMAKE_CXX_FLAGS_MINSIZEREL=-Os -DNDEBUG",
"-DCMAKE_SHARED_LINKER_FLAGS=-Wl,--strip-all,-gc-sections",
"-DCMAKE_C_FLAGS=-ffunction-sections -fdata-sections -fvisibility=hidden",
"-DCMAKE_CXX_FLAGS=-ffunction-sections -fdata-sections -fvisibility=hidden -fvisibility-inlines-hidden"
}
}
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# ProGuard rules consumed by applications using this AAR.
# Keep the JNI bridge so applications calling its native methods are not stripped.
-keep class com.library.babylonnative.** { *; }
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Keep all classes called from JNI by name.
-keep class com.library.babylonnative.** { *; }
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
</manifest>
Loading
Loading