[cogl/wip/android: 11/12] android: Add a port of the Cogl hello world example



commit 423cdd2aff51c9b7b87138c5f61dc8ca0e48234b
Author: Damien Lespiau <damien lespiau intel com>
Date:   Mon May 16 17:26:05 2011 +0100

    android: Add a port of the Cogl hello world example

 examples/android/hello/.gitignore             |    8 +
 examples/android/hello/AndroidManifest.xml    |   30 ++++
 examples/android/hello/jni/Android.mk         |   19 +++
 examples/android/hello/jni/Application.mk     |    1 +
 examples/android/hello/jni/main.c             |  188 +++++++++++++++++++++++++
 examples/android/hello/res/values/strings.xml |    4 +
 6 files changed, 250 insertions(+), 0 deletions(-)
---
diff --git a/examples/android/hello/.gitignore b/examples/android/hello/.gitignore
new file mode 100644
index 0000000..65e965b
--- /dev/null
+++ b/examples/android/hello/.gitignore
@@ -0,0 +1,8 @@
+bin
+libs
+obj
+
+build.xml
+default.properties
+local.properties
+proguard.cfg
diff --git a/examples/android/hello/AndroidManifest.xml b/examples/android/hello/AndroidManifest.xml
new file mode 100644
index 0000000..3cb6026
--- /dev/null
+++ b/examples/android/hello/AndroidManifest.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- BEGIN_INCLUDE(manifest) -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android";
+        package="org.cogl.Hello"
+        android:versionCode="1"
+        android:versionName="1.0">
+
+    <!-- This is the platform API where NativeActivity was introduced. -->
+    <uses-sdk android:minSdkVersion="9" />
+
+    <!-- This .apk has no Java code itself, so set hasCode to false. -->
+    <application android:label="@string/app_name" android:hasCode="false">
+
+        <!-- Our activity is the built-in NativeActivity framework class.
+             This will take care of integrating with our NDK code. -->
+        <activity android:name="android.app.NativeActivity"
+                android:label="@string/app_name"
+                android:configChanges="orientation|keyboardHidden">
+            <!-- Tell NativeActivity the name of or .so -->
+            <meta-data android:name="android.app.lib_name"
+                    android:value="test-cogl-hello" />
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+
+</manifest>
+<!-- END_INCLUDE(manifest) -->
diff --git a/examples/android/hello/jni/Android.mk b/examples/android/hello/jni/Android.mk
new file mode 100644
index 0000000..01c811c
--- /dev/null
+++ b/examples/android/hello/jni/Android.mk
@@ -0,0 +1,19 @@
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE    := test-cogl-hello
+LOCAL_SRC_FILES := main.c
+LOCAL_LDLIBS    := -llog -landroid -lEGL -lGLESv1_CM
+LOCAL_STATIC_LIBRARIES := cogl android_native_app_glue gobject gmodule gthread glib-android glib iconv
+LOCAL_ARM_MODE := arm
+LOCAL_CFLAGS := 				\
+	-DG_LOG_DOMAIN=\"TestCoglHello\"	\
+	-DCOGL_ENABLE_EXPERIMENTAL_2_0_API	\
+	$(NULL)
+
+include $(BUILD_SHARED_LIBRARY)
+
+$(call import-module,android/native_app_glue)
+$(call import-module,glib)
+$(call import-module,cogl)
diff --git a/examples/android/hello/jni/Application.mk b/examples/android/hello/jni/Application.mk
new file mode 100644
index 0000000..22d188e
--- /dev/null
+++ b/examples/android/hello/jni/Application.mk
@@ -0,0 +1 @@
+APP_PLATFORM := android-9
diff --git a/examples/android/hello/jni/main.c b/examples/android/hello/jni/main.c
new file mode 100644
index 0000000..05cb20e
--- /dev/null
+++ b/examples/android/hello/jni/main.c
@@ -0,0 +1,188 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ * Copyright (C) 2011 Intel Corporation
+ *
+ * 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.
+ *
+ */
+
+/*
+ * This file is derived from the "native-activity" sample of the android NDK
+ * r5b. The coding style has been adapted to the code style most commonly found
+ * in glib/gobject based projects.
+ */
+
+#include <android_native_app_glue.h>
+
+#include <glib.h>
+#include <glib-android/glib-android.h>
+#include <cogl/cogl.h>
+
+typedef struct
+{
+  struct android_app* app;
+
+  CoglContext *context;
+  CoglPrimitive *triangle;
+  CoglFramebuffer *fb;
+} TestData;
+
+static int test_init (TestData* data)
+{
+  CoglOnscreen *onscreen;
+  GError *error = NULL;
+  CoglVertexP2C4 triangle_vertices[] = {
+        {0, 0.7, 0xff, 0x00, 0x00, 0x80},
+        {-0.7, -0.7, 0x00, 0xff, 0x00, 0xff},
+        {0.7, -0.7, 0x00, 0x00, 0xff, 0xff}
+  };
+
+  cogl_android_set_native_window (data->app->window);
+
+  data->context = cogl_context_new (NULL, &error);
+  if (!data->context)
+    {
+      g_critical ("Failed to create context: %s\n", error->message);
+      return 1;
+    }
+
+  onscreen = cogl_onscreen_new (data->context, 320, 420);
+
+  /* Eventually there will be an implicit allocate on first use so this
+   * will become optional... */
+  data->fb = COGL_FRAMEBUFFER (onscreen);
+  if (!cogl_framebuffer_allocate (data->fb, &error))
+    {
+      if (error)
+        g_critical ("Failed to allocate framebuffer: %s\n", error->message);
+      else
+        g_critical ("Failed to allocate framebuffer");
+      return 1;
+    }
+
+  cogl_onscreen_show (onscreen);
+
+  cogl_push_framebuffer (data->fb);
+
+  data->triangle = cogl_primitive_new_p2c4 (COGL_VERTICES_MODE_TRIANGLES,
+                                            3, triangle_vertices);
+
+  return 0;
+}
+
+static test_draw_frame_and_swap (TestData *data)
+{
+  if (data->context)
+    {
+      cogl_primitive_draw (data->triangle);
+      cogl_framebuffer_swap_buffers (data->fb);
+    }
+}
+
+static void
+test_fini (TestData *data)
+{
+  if (data->fb)
+    {
+      cogl_object_unref (data->triangle);
+      cogl_object_unref (data->fb);
+      cogl_object_unref (data->context);
+      data->triangle = NULL;
+      data->fb = NULL;
+      data->context = NULL;
+    }
+}
+
+/**
+ * Process the next main command.
+ */
+static void
+test_handle_cmd (struct android_app* app,
+                 int32_t             cmd)
+{
+  TestData *data = (TestData *) app->userData;
+
+  switch (cmd)
+    {
+    case APP_CMD_INIT_WINDOW:
+      /* The window is being shown, get it ready */
+      g_message ("command: INIT_WINDOW");
+      if (data->app->window != NULL)
+        {
+          test_init (data);
+          test_draw_frame_and_swap (data);
+        }
+      break;
+
+    case APP_CMD_TERM_WINDOW:
+      /* The window is being hidden or closed, clean it up */
+      g_message ("command: TERM_WINDOW");
+      test_fini (data);
+      break;
+
+    case APP_CMD_GAINED_FOCUS:
+      g_message ("command: GAINED_FOCUS");
+      break;
+
+    case APP_CMD_LOST_FOCUS:
+      /* When our app loses focus, we stop monitoring the accelerometer.
+       * This is to avoid consuming battery while not being used. */
+      g_message ("command: LOST_FOCUS");
+      test_draw_frame_and_swap (data);
+      break;
+    }
+}
+
+/**
+ * This is the main entry point of a native application that is using
+ * android_native_app_glue.  It runs in its own thread, with its own
+ * event loop for receiving input events and doing other things.
+ */
+void
+android_main (struct android_app* application)
+{
+  TestData data;
+
+  /* Make sure glue isn't stripped */
+  app_dummy ();
+
+  g_android_init (NULL, NULL, G_ANDROID_INIT_FLAG_LOG_HANDLER);
+
+  memset (&data, 0, sizeof (TestData));
+  application->userData = &data;
+  application->onAppCmd = test_handle_cmd;
+  data.app = application;
+
+  while (1)
+    {
+      int events;
+      struct android_poll_source* source;
+
+      while ((ALooper_pollAll (0, NULL, &events, (void**)&source)) >= 0)
+        {
+
+          /* Process this event */
+          if (source != NULL)
+            source->process (application, source);
+
+          /* Check if we are exiting */
+          if  (application->destroyRequested != 0)
+            {
+              test_fini (&data);
+              return;
+            }
+      }
+
+      test_draw_frame_and_swap (&data);
+    }
+}
diff --git a/examples/android/hello/res/values/strings.xml b/examples/android/hello/res/values/strings.xml
new file mode 100644
index 0000000..e4cdec0
--- /dev/null
+++ b/examples/android/hello/res/values/strings.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_name">TestCoglHello</string>
+</resources>



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]