Skip to content

Android build script #21

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 3 commits into
base: main
Choose a base branch
from
Draft
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
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,10 @@ test.exe
*.res
eepers.app

*.apk.idsig
android/lib
android/build
eepers.apk

.idea
.DS_Store
28 changes: 28 additions & 0 deletions android/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="io.github.tsoding.eepers"
android:versionCode="12"
android:versionName="1.2">

<application
android:allowBackup="false"
android:debuggable="true"
android:fullBackupContent="false"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:hasCode="false">
<activity android:name="android.app.NativeActivity"
android:label="@string/app_name"
android:configChanges="orientation|keyboardHidden"
android:exported="true">
<meta-data android:name="android.app.lib_name"
android:value="eepers" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>
56 changes: 56 additions & 0 deletions android/main.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
#include <string.h>
#include <stdlib.h>
#include <android/log.h>
#include <android/asset_manager.h>
#include <android_native_app_glue.h>

extern void eepersinit(void);
extern void _ada_eepers(void);
extern void eepersfinal(void);

#define LOG_TAG "Eepers"
#define ALOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)

// Dummy implementations to workaround GNAT-LLVM bugs
typedef void __sigtramphandler_t (int signo, void *siginfo, void *sigcontext);

void __gnat_sigtramp (int signo, void *siginfo, void *sigcontext, __sigtramphandler_t * handler) {
ALOGD("%s: Signal %d, siginfo %p, sigcontext %p, handler %p", __func__, signo, siginfo, sigcontext, handler);
exit(1);
}
unsigned char _r_debug[640*1024] = {};


extern const char *GetApplicationDirectory(void);
extern const char *GetWorkingDirectory(void);
extern void SetLoadFileDataCallback(void *);

extern struct android_app *GetAndroidApp(void);
static struct android_app *app;

const unsigned char *LoadFileDataCallback(const char *fileName, int *dataSize) {
if (memcmp(fileName, "assets/", strlen("assets/")) != 0) {
return 0;
}
fileName += strlen("assets/");

AAsset *asset = AAssetManager_open(app->activity->assetManager, fileName, AASSET_MODE_BUFFER);
*dataSize = AAsset_getLength(asset);
ALOGD("%s: Opening %s (size %d)", __func__, fileName, *dataSize);
unsigned char *data = malloc(*dataSize);
memcpy(data, AAsset_getBuffer(asset), *dataSize);
return data;
}

int main(void) {
app = GetAndroidApp();
SetLoadFileDataCallback(LoadFileDataCallback);

ALOGD("Initializing with eepersinit()");
eepersinit();
ALOGD("Entering Eepers main: _ada_eepers");
_ada_eepers();
ALOGD("Deinitializing with eepersfinal()");
eepersfinal();
ALOGD("%s: Done!", __func__);
}
1 change: 1 addition & 0 deletions android/res/drawable-hdpi/ic_launcher.png
4 changes: 4 additions & 0 deletions android/res/values/strings.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Eepers</string>
</resources>
91 changes: 91 additions & 0 deletions build-android.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
#!/bin/sh

set -xe

ABIS="arm64-v8a"
API=33

BUILD_TOOLS=$ANDROID_HOME/Sdk/build-tools/34.0.0
TOOLCHAIN=$CLANG_R475365B_CUSTOM
ANDROID_NDK=$ANDROID_HOME/Sdk/ndk/26.1.10909125
NATIVE_APP_GLUE=$ANDROID_NDK/sources/android/native_app_glue
LLVM_GNAT_BIN=$LLVM_GNAT/llvm-interface/bin

SYSROOTS=$CLANG_R475365B_CUSTOM/../../../sysroots

FLAGS="-ffunction-sections -funwind-tables -fstack-protector-strong -fPIC -Wall \
-Wformat -Werror=format-security -no-canonical-prefixes \
-DANDROID -DPLATFORM_ANDROID -D__ANDROID_API__=$API"

mkdir -p android/res/drawable-hdpi
mkdir -p android/lib/arm64-v8a
mkdir -p android/build

SRC="eepers.adb raylib.adb raymath.ads"
OBJ="raylib raymath eepers"

for ABI in $ABIS; do
case "$ABI" in
"armeabi-v7a")
CCTYPE="armv7a-linux-androideabi"
ARCH="arm"
ARCH_SYSROOT="arm"
LIBPATH="arm-linux-androideabi"
ABI_FLAGS="-std=c99 -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16"
;;

"arm64-v8a")
CCTYPE="aarch64-linux-android"
ARCH="aarch64"
ARCH_SYSROOT="arm64"
LIBPATH="aarch64-linux-android"
ABI_FLAGS="-std=c99 -target aarch64"
;;
esac
CC="$TOOLCHAIN/bin/clang"
SYSROOT=$SYSROOTS/ndk/$ARCH_SYSROOT
LLD=$CLANG_R475365B_CUSTOM/bin/ld.lld
INCLUDES="-I$NATIVE_APP_GLUE -I$SYSROOT/usr/include/$CCTYPE -I$SYSROOT/usr/include"

# Compile native app glue
#$CC $INCLUDES --target=$CCTYPE$API -c $NATIVE_APP_GLUE/android_native_app_glue.c -o android/build/native_app_glue.o $FLAGS $ABI_FLAGS
$CC $INCLUDES --target=$CCTYPE$API -c android/main.c -o android/build/main.o $FLAGS $ABI_FLAGS

# Compile project

for file in $SRC; do
$LLVM_GNAT_BIN/llvm-gcc -g --target=aarch64-linux-android$API -fPIC -gnat2022 $file -c
done

$LLVM_GNAT/llvm-interface/bin/llvm-gnatbind -Leepers eepers.ali
$LLVM_GNAT/llvm-interface/bin/llvm-gnatlink eepers.ali -o android/lib/$ABI/libeepers.so --LINK="$LLD" android/build/*.o -shared \
--exclude-libs libatomic.a --build-id -z noexecstack -z relro -z now --warn-shared-textrel -u ANativeActivity_onCreate \
--sysroot=$SYSROOT -L$CLANG_R475365B_CUSTOM/lib/clang/16.0.2/lib/linux -L$CLANG_R475365B_CUSTOM/lib/clang/16.0.2/lib/linux/$ARCH \
-L$SYSROOT/usr/lib/$LIBPATH/$API -L$SYSROOT/usr/lib/$LIBPATH -Landroid/build -Lraylib/raylib-5.0_android_$ABI \
-lraylib -llog -landroid -lEGL -lGLESv2 -lOpenSLES -lc -lm -ldl -l:libclang_rt.builtins-$ARCH-android.a -lunwind
done

# ______________________________________________________________________________
#
# Build APK
# ______________________________________________________________________________
#
$BUILD_TOOLS/aapt package -f -m --min-sdk-version 29 --target-sdk-version $API \
-S android/res -J android/build -M android/AndroidManifest.xml \
-I $ANDROID_HOME/Sdk/platforms/android-$API/android.jar

# Add resources and assets to APK
$BUILD_TOOLS/aapt package -f --min-sdk-version 29 --target-sdk-version $API \
-M android/AndroidManifest.xml -S android/res -A assets \
-I $ANDROID_HOME/Sdk/platforms/android-$API/android.jar -F eepers.apk

# Add libraries to APK
cd android
for ABI in $ABIS; do
$BUILD_TOOLS/aapt add ../eepers.apk lib/$ABI/libeepers.so
done
cd ..

$BUILD_TOOLS/zipalign -f 4 eepers.apk eepers.4.apk
$BUILD_TOOLS/apksigner sign --ks ~/.android/debug.keystore --ks-pass pass:android eepers.4.apk
mv -f eepers.4.apk eepers.apk
2 changes: 2 additions & 0 deletions eepers.ads
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
procedure Eepers;
pragma Export (C, Eepers, "_ada_eepers");
Binary file added raylib/raylib-5.0_android_arm64-v8a/libraylib.a
Binary file not shown.