最新的 Android 2.3 无需 Java 就可以开发应用,详情请看 这里。
这里是官方给的例子程序 ,来自:http://developer.android.com/reference/android/app/NativeActivity.html
[代码] AndroidManifest.xml
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.example.native_activity"
- android:versionCode="1"
- android:versionName="1.0">
-
-
- <uses-sdk android:minSdkVersion="8" />
-
-
- <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">
-
- <meta-data android:name="android.app.lib_name"
- android:value="native-activity" />
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
-
- </manifest>
[代码] Demo.c
- #include <jni.h>
- #include <errno.h>
-
- #include <EGL/egl.h>
- #include <GLES/gl.h>
-
- #include <android/sensor.h>
- #include <android/log.h>
- #include <android_native_app_glue.h>
-
- #define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO
- , "native-activity", __VA_ARGS__))
- #define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN
- , "native-activity", __VA_ARGS__))
-
-
-
-
- struct saved_state {
- float angle;
- int32_t x;
- int32_t y;
- };
-
-
-
-
- struct engine {
- struct android_app* app;
-
- ASensorManager* sensorManager;
- const ASensor* accelerometerSensor;
- ASensorEventQueue* sensorEventQueue;
-
- int animating;
- EGLDisplay display;
- EGLSurface surface;
- EGLContext context;
- int32_t width;
- int32_t height;
- struct saved_state state;
- };
-
-
-
-
- static int engine_init_display(struct engine* engine) {
-
-
-
-
-
-
-
- const EGLint attribs[] = {
- EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
- EGL_BLUE_SIZE, 8,
- EGL_GREEN_SIZE, 8,
- EGL_RED_SIZE, 8,
- EGL_NONE
- };
- EGLint w, h, dummy, format;
- EGLint numConfigs;
- EGLConfig config;
- EGLSurface surface;
- EGLContext context;
-
- EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
-
- eglInitialize(display, 0, 0);
-
-
-
-
- eglChooseConfig(display, attribs, &config, 1, &numConfigs);
-
-
-
-
-
- eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format);
-
- ANativeWindow_setBuffersGeometry(engine->app->window, 0, 0, format);
-
- surface = eglCreateWindowSurface(display, config, engine->app->window, NULL);
- context = eglCreateContext(display, config, NULL, NULL);
-
- if (eglMakeCurrent(display, surface, surface, context) == EGL_FALSE) {
- LOGW("Unable to eglMakeCurrent");
- return -1;
- }
-
- eglQuerySurface(display, surface, EGL_WIDTH, &w);
- eglQuerySurface(display, surface, EGL_HEIGHT, &h);
-
- engine->display = display;
- engine->context = context;
- engine->surface = surface;
- engine->width = w;
- engine->height = h;
- engine->state.angle = 0;
-
-
- glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
- glEnable(GL_CULL_FACE);
- glShadeModel(GL_SMOOTH);
- glDisable(GL_DEPTH_TEST);
-
- return 0;
- }
-
-
-
-
- static void engine_draw_frame(struct engine* engine) {
- if (engine->display == NULL) {
-
- return;
- }
-
-
- glClearColor(((float)engine->state.x)/engine->width, engine->state.angle,
- ((float)engine->state.y)/engine->height, 1);
- glClear(GL_COLOR_BUFFER_BIT);
-
- eglSwapBuffers(engine->display, engine->surface);
- }
-
-
-
-
- static void engine_term_display(struct engine* engine) {
- if (engine->display != EGL_NO_DISPLAY) {
- eglMakeCurrent(engine->display, EGL_NO_SURFACE, EGL_NO_SURFACE
- , EGL_NO_CONTEXT);
- if (engine->context != EGL_NO_CONTEXT) {
- eglDestroyContext(engine->display, engine->context);
- }
- if (engine->surface != EGL_NO_SURFACE) {
- eglDestroySurface(engine->display, engine->surface);
- }
- eglTerminate(engine->display);
- }
- engine->animating = 0;
- engine->display = EGL_NO_DISPLAY;
- engine->context = EGL_NO_CONTEXT;
- engine->surface = EGL_NO_SURFACE;
- }
-
-
-
-
- static int32_t engine_handle_input(struct android_app* app, AInputEvent* event) {
- struct engine* engine = (struct engine*)app->userData;
- if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION) {
- engine->animating = 1;
- engine->state.x = AMotionEvent_getX(event, 0);
- engine->state.y = AMotionEvent_getY(event, 0);
- return 1;
- }
- return 0;
- }
-
-
-
-
(红薯 )
|