summaryrefslogtreecommitdiff
path: root/ide/AndroidStudio3/app/src/main/cpp
diff options
context:
space:
mode:
authorMatthias Melcher <fltk@matthiasm.com>2018-03-05 23:17:51 +0000
committerMatthias Melcher <fltk@matthiasm.com>2018-03-05 23:17:51 +0000
commit3ed5e71da71e50849eb9e2c3244e843bc5e38a05 (patch)
tree245443359440a9b9927660e5a48b388bce0ce820 /ide/AndroidStudio3/app/src/main/cpp
parentb47db80af359e5ab3b2188573cbf42ee439a2be7 (diff)
Android: moved to IDE directory.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.4@12711 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'ide/AndroidStudio3/app/src/main/cpp')
-rw-r--r--ide/AndroidStudio3/app/src/main/cpp/CMakeLists.txt45
-rw-r--r--ide/AndroidStudio3/app/src/main/cpp/HelloAndroid.cxx182
2 files changed, 227 insertions, 0 deletions
diff --git a/ide/AndroidStudio3/app/src/main/cpp/CMakeLists.txt b/ide/AndroidStudio3/app/src/main/cpp/CMakeLists.txt
new file mode 100644
index 000000000..408052168
--- /dev/null
+++ b/ide/AndroidStudio3/app/src/main/cpp/CMakeLists.txt
@@ -0,0 +1,45 @@
+#
+# Copyright (C) The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+cmake_minimum_required(VERSION 3.4.1)
+
+set(FLTK_DIR ../../../../../..)
+
+# FIXME: add as a second argument the binary build dir
+# so that the first argument can link directly to FLTK
+# instead of the fltk symlink, which is bad for SVN
+add_subdirectory(${FLTK_DIR}/ "${CMAKE_CURRENT_BINARY_DIR}/fltk" EXCLUDE_FROM_ALL)
+
+# now build app's shared lib
+add_library(android-hello SHARED
+ HelloAndroid.cxx)
+
+target_include_directories(android-hello PRIVATE
+ ${FLTK_DIR}/
+ ${FLTK_DIR}/Android/)
+
+# Export ANativeActivity_onCreate(),

+# Refer to: https://github.com/android-ndk/ndk/issues/381.
+set(CMAKE_SHARED_LINKER_FLAGS
+ "${CMAKE_SHARED_LINKER_FLAGS} -u ANativeActivity_onCreate")
+
+# add lib dependencies
+target_link_libraries(android-hello
+ fltk
+ android
+ log
+ m)
+
diff --git a/ide/AndroidStudio3/app/src/main/cpp/HelloAndroid.cxx b/ide/AndroidStudio3/app/src/main/cpp/HelloAndroid.cxx
new file mode 100644
index 000000000..bba38a5b7
--- /dev/null
+++ b/ide/AndroidStudio3/app/src/main/cpp/HelloAndroid.cxx
@@ -0,0 +1,182 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+//#include <android_native_app_glue.h>
+#include <src/drivers/Android/Fl_Android_Application.H>
+#include <src/drivers/Android/Fl_Android_Screen_Driver.H>
+
+#include <FL/Fl_Window.H>
+#include <FL/Fl_Button.H>
+#include <FL/Enumerations.H>
+Fl_Window *win;
+Fl_Button *btn;
+
+#include <errno.h>
+#include <jni.h>
+#include <sys/time.h>
+#include <time.h>
+#include <android/log.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#define LOG_TAG "HelloFLTK"
+#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
+#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,LOG_TAG,__VA_ARGS__)
+#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
+
+/* Set to 1 to enable debug log traces. */
+#define DEBUG 0
+
+// ----------------------------------------------------------------------
+
+struct engine {
+ int animating;
+};
+
+struct engine engine = { 0 };
+
+static void engine_draw_frame()
+{
+ //if (Fl_Android_Application::lock_screen()) {
+ Fl::damage(FL_DAMAGE_ALL);
+ win->redraw();
+ Fl::flush();
+ // Fl_Android_Application::unlock_and_post_screen();
+ //}
+}
+
+static void engine_term_display() {
+ engine.animating = 0;
+}
+
+static int32_t engine_handle_input(AInputEvent* event) {
+ if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION) {
+ engine.animating = 1;
+ Fl::e_x = Fl::e_x_root = AMotionEvent_getX(event, 0) * 600 / ANativeWindow_getWidth(Fl_Android_Application::native_window());
+ Fl::e_y = Fl::e_y_root = AMotionEvent_getY(event, 0) * 800 / ANativeWindow_getHeight(Fl_Android_Application::native_window());
+ Fl::e_state = FL_BUTTON1;
+ Fl::e_keysym = FL_Button+1;
+ if (AMotionEvent_getAction(event)==AMOTION_EVENT_ACTION_DOWN) {
+ Fl::e_is_click = 1;
+ Fl::handle(FL_PUSH, Fl::first_window());
+ LOGE("Mouse push %d at %d, %d", Fl::event_button(), Fl::event_x(), Fl::event_y());
+ } else if (AMotionEvent_getAction(event)==AMOTION_EVENT_ACTION_MOVE) {
+ Fl::handle(FL_DRAG, Fl::first_window());
+ } else if (AMotionEvent_getAction(event)==AMOTION_EVENT_ACTION_UP) {
+ Fl::e_state = 0;
+ Fl::handle(FL_RELEASE, Fl::first_window());
+ }
+ return 1;
+ } else if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_KEY) {
+ LOGI("Key event: action=%d keyCode=%d metaState=0x%x",
+ AKeyEvent_getAction(event),
+ AKeyEvent_getKeyCode(event),
+ AKeyEvent_getMetaState(event));
+ }
+
+ return 0;
+}
+
+static void engine_handle_cmd(int32_t cmd) {
+ static int32_t format = WINDOW_FORMAT_RGB_565;
+ switch (cmd) {
+ case APP_CMD_INIT_WINDOW:
+ if (Fl_Android_Application::native_window() != NULL) {
+ // fill_plasma() assumes 565 format, get it here
+ format = ANativeWindow_getFormat(Fl_Android_Application::native_window());
+ ANativeWindow_setBuffersGeometry(Fl_Android_Application::native_window(),
+#if 1
+ 600, //ANativeWindow_getWidth(app->window),
+ 800, //ANativeWindow_getHeight(app->window),
+#else
+ ANativeWindow_getWidth(app->window),
+ ANativeWindow_getHeight(app->window),
+#endif
+ WINDOW_FORMAT_RGB_565);
+ engine_draw_frame();
+ }
+ break;
+ case APP_CMD_TERM_WINDOW:
+ engine_term_display();
+ ANativeWindow_setBuffersGeometry(Fl_Android_Application::native_window(),
+#if 1
+ 600, //ANativeWindow_getWidth(app->window),
+ 800, //ANativeWindow_getHeight(app->window),
+#else
+ ANativeWindow_getWidth(app->window),
+ ANativeWindow_getHeight(app->window),
+#endif
+ format);
+ break;
+ case APP_CMD_LOST_FOCUS:
+ engine.animating = 0;
+ engine_draw_frame();
+ break;
+ default: break;
+ }
+}
+
+
+int main(int argc, char **argv)
+{
+ Fl_Android_Application::log_e("App path is %s", argv[0]);
+
+ memset(&engine, 0, sizeof(engine));
+ Fl_Android_Application::set_on_app_cmd(engine_handle_cmd);
+ Fl_Android_Application::set_on_input_event(engine_handle_input);
+
+ win = new Fl_Window(10, 10, 600, 400, "Hallo");
+ btn = new Fl_Button(190, 200, 280, 35, "Hello, Android!");
+ btn->color(FL_LIGHT2);
+ win->show();
+ Fl::damage(FL_DAMAGE_ALL);
+ win->redraw();
+
+
+ // loop waiting for stuff to do.
+
+ while (1) {
+ // Read all pending events.
+ int ident;
+ int events;
+ struct android_poll_source* source;
+
+ // If not animating, we will block forever waiting for events.
+ // If animating, we loop until all events are read, then continue
+ // to draw the next frame of animation.
+ while ((ident=ALooper_pollAll(engine.animating ? 0 : -1, NULL, &events,
+ (void**)&source)) >= 0) {
+
+ // Process this event.
+ if (source != NULL) {
+ source->process(source);
+ }
+
+ // Check if we are exiting.
+ if (Fl_Android_Application::destroy_requested() != 0) {
+ LOGI("Engine thread destroy requested!");
+ engine_term_display();
+ return 0;
+ }
+ }
+ Fl::flush();
+ }
+ return 0;
+}