diff --git a/examples/others/android/logcat_jni/README.md b/examples/others/android/logcat_jni/README.md new file mode 100644 index 0000000..552e75f --- /dev/null +++ b/examples/others/android/logcat_jni/README.md @@ -0,0 +1,5 @@ +### Android get jni +How to compile is in [example](https://github.com/gen2brain/raylib-go/blob/master/examples/others/android/example/README.md), this example: +- show how get jni enviroment +- add build.sh which you need only rewrite paths and run +- show what you need to add to your project to see fmt output in logcat in init_android.go \ No newline at end of file diff --git a/examples/others/android/logcat_jni/android.go b/examples/others/android/logcat_jni/android.go new file mode 100644 index 0000000..3af44f9 --- /dev/null +++ b/examples/others/android/logcat_jni/android.go @@ -0,0 +1,116 @@ +//go:build android + +package main + +/* + +#cgo LDFLAGS: -landroid + +#include +#include + +extern struct ANativeActivity *GetANativeActivity(void); // if you need android_app (jni) put and call this + +static char* getJNI(uintptr_t *vmp, uintptr_t* envp, uintptr_t* ctx, int* attachedp) { + JNIEnv* env; + struct ANativeActivity * activity = GetANativeActivity(); + *attachedp = 0; + JavaVM* vm = activity->vm; + switch ((*vm)->GetEnv(vm, (void**)&env, JNI_VERSION_1_6)) { + case JNI_OK: + break; + case JNI_EDETACHED: + if ((*vm)->AttachCurrentThread(vm, &env, 0) != 0) { + return "cannot attach to JVM"; + } + *attachedp = 1; + break; + case JNI_EVERSION: + return "bad JNI version"; + default: + return "unknown JNI error from GetEnv"; + } + + *envp = (uintptr_t)env; + *vmp = (uintptr_t)vm; + *ctx = (uintptr_t)(activity->clazz); + return NULL; +} + +static char* checkException(uintptr_t jnienv) { + jthrowable exc; + JNIEnv* env = (JNIEnv*)jnienv; + + if (!(*env)->ExceptionCheck(env)) { + return NULL; + } + + exc = (*env)->ExceptionOccurred(env); + (*env)->ExceptionClear(env); + + jclass clazz = (*env)->FindClass(env, "java/lang/Throwable"); + jmethodID toString = (*env)->GetMethodID(env, clazz, "toString", "()Ljava/lang/String;"); + jobject msgStr = (*env)->CallObjectMethod(env, exc, toString); + return (char*)(*env)->GetStringUTFChars(env, msgStr, 0); +} + +static void unlockJNI(uintptr_t vmp) { + JavaVM *vm = (JavaVM *)vmp; + (*vm)->DetachCurrentThread(vm); +} + +const char * getInternalStoragePathMy(){ + return GetANativeActivity()->internalDataPath; +} +*/ +import "C" +import ( + "errors" + "fmt" + "runtime" + "unsafe" +) + +func doSpecific() { + fmt.Println("calling GetANativeActivity()->internalDataPath: ", C.GoString(C.getInternalStoragePathMy())) // this is only example to show how work GetANativeActivity() + // fmt.Println("calling rl.HomeDir(): ", rl.HomeDir()) // this work too + err := RunOnJVM(func(vm, env, ctx uintptr) error { + // do anything with jni + return nil + }) + if err != nil { + fmt.Println(err) + } +} + +func RunOnJVM(fn func(vm, env, ctx uintptr) error) error { + if fn == nil { + return errors.New("fn is nil") + } + errch := make(chan error) + go func() { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + var envp, vmp, ctxp C.uintptr_t + attached := C.int(0) + if errStr := C.getJNI(&vmp, &envp, &ctxp, &attached); errStr != nil { + errch <- errors.New(C.GoString(errStr)) + return + } + if attached != 0 { + defer C.unlockJNI(vmp) + } + if err := fn(uintptr(vmp), uintptr(envp), uintptr(ctxp)); err != nil { + errch <- err + return + } + + if exc := C.checkException(envp); exc != nil { + errch <- errors.New(C.GoString(exc)) + C.free(unsafe.Pointer(exc)) + return + } + errch <- nil + }() + return <-errch +} diff --git a/examples/others/android/logcat_jni/android/AndroidManifest.xml b/examples/others/android/logcat_jni/android/AndroidManifest.xml new file mode 100644 index 0000000..19b1694 --- /dev/null +++ b/examples/others/android/logcat_jni/android/AndroidManifest.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/others/android/logcat_jni/android/assets/alagard.rbmf b/examples/others/android/logcat_jni/android/assets/alagard.rbmf new file mode 100644 index 0000000..8c9b68d Binary files /dev/null and b/examples/others/android/logcat_jni/android/assets/alagard.rbmf differ diff --git a/examples/others/android/logcat_jni/android/assets/ambient.ogg b/examples/others/android/logcat_jni/android/assets/ambient.ogg new file mode 100644 index 0000000..af7f836 Binary files /dev/null and b/examples/others/android/logcat_jni/android/assets/ambient.ogg differ diff --git a/examples/others/android/logcat_jni/android/assets/coin.wav b/examples/others/android/logcat_jni/android/assets/coin.wav new file mode 100644 index 0000000..6684ffc Binary files /dev/null and b/examples/others/android/logcat_jni/android/assets/coin.wav differ diff --git a/examples/others/android/logcat_jni/android/assets/raylib_logo.png b/examples/others/android/logcat_jni/android/assets/raylib_logo.png new file mode 100644 index 0000000..6654562 Binary files /dev/null and b/examples/others/android/logcat_jni/android/assets/raylib_logo.png differ diff --git a/examples/others/android/logcat_jni/android/build.gradle b/examples/others/android/logcat_jni/android/build.gradle new file mode 100644 index 0000000..b819fb4 --- /dev/null +++ b/examples/others/android/logcat_jni/android/build.gradle @@ -0,0 +1,35 @@ +apply plugin: 'com.android.application' + +android { + namespace = "com.example.android" + compileSdkVersion 34 + buildToolsVersion '34.0.0' + + defaultConfig { + applicationId "com.example.android" + minSdkVersion 16 + targetSdkVersion 34 + versionCode 1 + versionName '1.0' + } + + buildTypes { + release { + minifyEnabled false + zipAlignEnabled true + } + } + + sourceSets { + main { + jniLibs.srcDirs = ['libs'] + res.srcDirs = ['res'] + assets.srcDirs = ['assets'] + + manifest.srcFile 'AndroidManifest.xml' + } + } +} + +dependencies { +} diff --git a/examples/others/android/logcat_jni/android/res/drawable-hdpi/icon.png b/examples/others/android/logcat_jni/android/res/drawable-hdpi/icon.png new file mode 100644 index 0000000..34a6155 Binary files /dev/null and b/examples/others/android/logcat_jni/android/res/drawable-hdpi/icon.png differ diff --git a/examples/others/android/logcat_jni/android/res/drawable-ldpi/icon.png b/examples/others/android/logcat_jni/android/res/drawable-ldpi/icon.png new file mode 100644 index 0000000..cc72255 Binary files /dev/null and b/examples/others/android/logcat_jni/android/res/drawable-ldpi/icon.png differ diff --git a/examples/others/android/logcat_jni/android/res/drawable-mdpi/icon.png b/examples/others/android/logcat_jni/android/res/drawable-mdpi/icon.png new file mode 100644 index 0000000..72713a9 Binary files /dev/null and b/examples/others/android/logcat_jni/android/res/drawable-mdpi/icon.png differ diff --git a/examples/others/android/logcat_jni/android/res/values/strings.xml b/examples/others/android/logcat_jni/android/res/values/strings.xml new file mode 100644 index 0000000..15895d9 --- /dev/null +++ b/examples/others/android/logcat_jni/android/res/values/strings.xml @@ -0,0 +1,4 @@ + + + raylib-go + diff --git a/examples/others/android/logcat_jni/build.gradle b/examples/others/android/logcat_jni/build.gradle new file mode 100644 index 0000000..301e2dd --- /dev/null +++ b/examples/others/android/logcat_jni/build.gradle @@ -0,0 +1,16 @@ +buildscript { + repositories { + jcenter() + google() + } + dependencies { + classpath 'com.android.tools.build:gradle:8.2.2' + } +} + +allprojects { + repositories { + jcenter() + google() + } +} diff --git a/examples/others/android/logcat_jni/build.sh b/examples/others/android/logcat_jni/build.sh new file mode 100644 index 0000000..a69da74 --- /dev/null +++ b/examples/others/android/logcat_jni/build.sh @@ -0,0 +1,13 @@ + +# export ANDROID_NDK_HOME=/opt/android-ndk +# export ANDROID_HOME=/opt/android-sdk +go clean +export PATH=${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin:${PATH} +export ANDROID_SYSROOT=${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/sysroot +export ANDROID_API=21 +export ANDROID_TOOLCHAIN=${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64 +CC="aarch64-linux-android${ANDROID_API}-clang" CGO_CFLAGS="-I${ANDROID_SYSROOT}/usr/include -I${ANDROID_SYSROOT}/usr/include/aarch64-linux-android --sysroot=${ANDROID_SYSROOT}" CGO_LDFLAGS="-L${ANDROID_SYSROOT}/usr/lib/aarch64-linux-android/${ANDROID_API} \ +-L${ANDROID_TOOLCHAIN}/aarch64-linux-android/lib --sysroot=${ANDROID_SYSROOT}" \ +CGO_ENABLED=1 GOOS=android GOARCH=arm64 \ +go build -buildmode=c-shared -ldflags="-s -w -extldflags=-Wl,-soname,libexample.so" -o=android/libs/arm64-v8a/libexample.so +./gradlew assembleDebug \ No newline at end of file diff --git a/examples/others/android/logcat_jni/gradle/wrapper/gradle-wrapper.jar b/examples/others/android/logcat_jni/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..13372ae Binary files /dev/null and b/examples/others/android/logcat_jni/gradle/wrapper/gradle-wrapper.jar differ diff --git a/examples/others/android/logcat_jni/gradle/wrapper/gradle-wrapper.properties b/examples/others/android/logcat_jni/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..b05c5cc --- /dev/null +++ b/examples/others/android/logcat_jni/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Mon Nov 13 02:02:23 CET 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-all.zip diff --git a/examples/others/android/logcat_jni/gradlew b/examples/others/android/logcat_jni/gradlew new file mode 100644 index 0000000..9d82f78 --- /dev/null +++ b/examples/others/android/logcat_jni/gradlew @@ -0,0 +1,160 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/examples/others/android/logcat_jni/gradlew.bat b/examples/others/android/logcat_jni/gradlew.bat new file mode 100644 index 0000000..aec9973 --- /dev/null +++ b/examples/others/android/logcat_jni/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/examples/others/android/logcat_jni/init_android.go b/examples/others/android/logcat_jni/init_android.go new file mode 100644 index 0000000..4def6e3 --- /dev/null +++ b/examples/others/android/logcat_jni/init_android.go @@ -0,0 +1,74 @@ +//go:build android + +package main + +/* +#cgo LDFLAGS: -landroid -llog +#include +#include +*/ +import "C" +import ( + "bufio" + "log" + "os" + "syscall" + "unsafe" +) + +var ( + ctag = C.CString("raylib") + // Store the writer end of the redirected stderr and stdout + // so that they are not garbage collected and closed. + stderr, stdout *os.File +) + +func init() { + log.SetOutput(infoWriter{}) + log.SetFlags(log.Flags() &^ log.LstdFlags) + r, w, err := os.Pipe() + if err != nil { + panic(err) + } + stderr = w + if err := syscall.Dup3(int(w.Fd()), int(os.Stderr.Fd()), 0); err != nil { + panic(err) + } + go lineLog(r, C.ANDROID_LOG_ERROR) + r, w, err = os.Pipe() + if err != nil { + panic(err) + } + stdout = w + if err := syscall.Dup3(int(w.Fd()), int(os.Stdout.Fd()), 0); err != nil { + panic(err) + } + go lineLog(r, C.ANDROID_LOG_INFO) +} + +type infoWriter struct{} + +func (infoWriter) Write(p []byte) (n int, err error) { + cstr := C.CString(string(p)) + C.__android_log_write(C.ANDROID_LOG_INFO, ctag, cstr) + C.free(unsafe.Pointer(cstr)) + return len(p), nil +} + +func lineLog(f *os.File, priority C.int) { + const logSize = 1024 // matches android/log.h. + r := bufio.NewReaderSize(f, logSize) + for { + line, _, err := r.ReadLine() + str := string(line) + if err != nil { + str += " " + err.Error() + } + cstr := C.CString(str) + C.__android_log_write(priority, ctag, cstr) + C.free(unsafe.Pointer(cstr)) + if err != nil { + break + } + } +} diff --git a/examples/others/android/logcat_jni/main.go b/examples/others/android/logcat_jni/main.go new file mode 100644 index 0000000..14c809d --- /dev/null +++ b/examples/others/android/logcat_jni/main.go @@ -0,0 +1,113 @@ +package main + +import ( + "os" + "runtime" + + "github.com/gen2brain/raylib-go/raylib" +) + +// Game states +const ( + Logo = iota + Title + GamePlay + Ending +) + +func init() { + rl.SetCallbackFunc(main) +} + +func main() { + screenWidth := int32(800) + screenHeight := int32(450) + + rl.SetConfigFlags(rl.FlagVsyncHint) + + rl.InitWindow(screenWidth, screenHeight, "Android example") + + rl.InitAudioDevice() + + currentScreen := Logo + + texture := rl.LoadTexture("raylib_logo.png") // Load texture (placed on assets folder) + fx := rl.LoadSound("coin.wav") // Load WAV audio file (placed on assets folder) + ambient := rl.LoadMusicStream("ambient.ogg") // Load music + + rl.PlayMusicStream(ambient) + + doSpecific() + framesCounter := 0 // Used to count frames + + //rl.SetTargetFPS(60) + + for !rl.WindowShouldClose() { + rl.UpdateMusicStream(ambient) + if runtime.GOOS == "android" && rl.IsKeyDown(rl.KeyBack) { + break + } + + switch currentScreen { + case Logo: + framesCounter++ // Count frames + + // Wait for 4 seconds (240 frames) before jumping to Title screen + if framesCounter > 240 { + currentScreen = Title + } + case Title: + // Press enter to change to GamePlay screen + if rl.IsGestureDetected(rl.GestureTap) { + rl.PlaySound(fx) + currentScreen = GamePlay + } + case GamePlay: + // Press enter to change to Ending screen + if rl.IsGestureDetected(rl.GestureTap) { + rl.PlaySound(fx) + currentScreen = Ending + } + case Ending: + // Press enter to return to Title screen + if rl.IsGestureDetected(rl.GestureTap) { + rl.PlaySound(fx) + currentScreen = Title + } + } + rl.BeginDrawing() + + rl.ClearBackground(rl.RayWhite) + + switch currentScreen { + case Logo: + rl.DrawText("LOGO SCREEN", 20, 20, 40, rl.LightGray) + rl.DrawTexture(texture, screenWidth/2-texture.Width/2, screenHeight/2-texture.Height/2, rl.White) + rl.DrawText("WAIT for 4 SECONDS...", 290, 400, 20, rl.Gray) + case Title: + rl.DrawRectangle(0, 0, screenWidth, screenHeight, rl.Green) + rl.DrawText("TITLE SCREEN", 20, 20, 40, rl.DarkGreen) + rl.DrawText("TAP SCREEN to JUMP to GAMEPLAY SCREEN", 160, 220, 20, rl.DarkGreen) + case GamePlay: + rl.DrawRectangle(0, 0, screenWidth, screenHeight, rl.Purple) + rl.DrawText("GAMEPLAY SCREEN", 20, 20, 40, rl.Maroon) + rl.DrawText("TAP SCREEN to JUMP to ENDING SCREEN", 170, 220, 20, rl.Maroon) + case Ending: + rl.DrawRectangle(0, 0, screenWidth, screenHeight, rl.Blue) + rl.DrawText("ENDING SCREEN", 20, 20, 40, rl.DarkBlue) + rl.DrawText("TAP SCREEN to RETURN to TITLE SCREEN", 160, 220, 20, rl.DarkBlue) + default: + break + } + + rl.EndDrawing() + } + + rl.UnloadSound(fx) // Unload sound data + rl.UnloadMusicStream(ambient) // Unload music stream data + rl.CloseAudioDevice() // Close audio device (music streaming is automatically stopped) + rl.UnloadTexture(texture) // Unload texture data + rl.CloseWindow() // Close window + + os.Exit(0) +} diff --git a/examples/others/android/logcat_jni/others.go b/examples/others/android/logcat_jni/others.go new file mode 100644 index 0000000..9885d68 --- /dev/null +++ b/examples/others/android/logcat_jni/others.go @@ -0,0 +1,7 @@ +//go:build !android + +package main + +func temp() { + +} diff --git a/examples/others/android/logcat_jni/settings.gradle b/examples/others/android/logcat_jni/settings.gradle new file mode 100644 index 0000000..d69713c --- /dev/null +++ b/examples/others/android/logcat_jni/settings.gradle @@ -0,0 +1 @@ +include ':android'