Android Native Executable Intro - 01 (without app_glue)

本文详细介绍了Android应用开发中如何进行日志管理,通过自定义日志宏来简化日志记录过程,并展示了NativeActivity的常用回调函数及如何在不同生命周期阶段进行日志输出。

 

 

 

in jni directory

1.  mylog.h

 

#ifndef COOKBOOK_LOG_H
#define COOKBOOK_LOG_H

#include <android/log.h>

#define LOG_LEVEL 4
#define LOG_TAG "NativeActivityOne"

#define LOGU(level, ...) if (level <= LOG_LEVEL) {__android_log_print(ANDROID_LOG_UNKNOWN, LOG_TAG, __VA_ARGS__);}
#define LOGD(level, ...) if (level <= LOG_LEVEL) {__android_log_print(ANDROID_LOG_DEFAULT, LOG_TAG, __VA_ARGS__);}
#define LOGV(level, ...) if (level <= LOG_LEVEL) {__android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__);}
#define LOGDE(level, ...) if (level <= LOG_LEVEL) {__android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__);}
#define LOGI(level, ...) if (level <= LOG_LEVEL) {__android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__);}
#define LOGW(level, ...) if (level <= LOG_LEVEL) {__android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__);}
#define LOGE(level, ...) if (level <= LOG_LEVEL) {__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__);}
#define LOGF(level, ...) if (level <= LOG_LEVEL) {__android_log_print(ANDROID_LOG_FATAL, LOG_TAG, __VA_ARGS__);}
#define LOGS(level, ...) if (level <= LOG_LEVEL) {__android_log_print(ANDROID_LOG_SILENT, LOG_TAG, __VA_ARGS__);}

#endif

2. NativeActivityOne.cpp

 

#include <jni.h>
#include <android/native_activity.h>

#include "mylog.h"

static void printInfo(ANativeActivity* activity) {
 LOGI(2, "internalDataPath: %s", activity->internalDataPath);
 LOGI(2, "externalDataPath: %s", activity->externalDataPath);
 jmethodID toStringMID;
 jclass activityCls = activity->env->GetObjectClass(activity->clazz);
 toStringMID = activity->env->GetMethodID(activityCls, "toString", "()Ljava/lang/String;");
 jstring activityStr = (jstring)activity->env->CallObjectMethod(activity->clazz, toStringMID);
 const char* activityCharStr = activity->env->GetStringUTFChars(activityStr, NULL);
 LOGI(2, "Activity toString: %s", activityCharStr);
 activity->env->ReleaseStringUTFChars(activityStr, activityCharStr);
 LOGI(2, "SDK version: %d", activity->sdkVersion);
}

static void onStart(ANativeActivity* activity) {
    LOGI(2, "-----onStart: %p\n", activity);
//    printInfo(activity);
}

static void onResume(ANativeActivity* activity) {
    LOGI(2, "-----onResume: %p\n", activity);
//    printInfo(activity);
}

static void* onSaveInstanceState(ANativeActivity* activity, size_t* outLen) {
    LOGI(2, "-----onSaveInstanceState: %p, %d\n", activity, *outLen);
//    printInfo(activity);
    return NULL;
}

static void onPause(ANativeActivity* activity) {
    LOGI(2, "-----onPause: %p\n", activity);
// printInfo(activity);
}

static void onStop(ANativeActivity* activity) {
    LOGI(2, "-----onStop: %p\n", activity);
// printInfo(activity);
}

static void onDestroy(ANativeActivity* activity) {
    LOGI(2, "-----onDestroy: %p\n", activity);
// printInfo(activity);
}

static void onWindowFocusChanged(ANativeActivity* activity, int focused) {
    LOGI(2, "-----onWindowFocusChanged: %p -- %d\n", activity, focused);
// printInfo(activity);
}

static void onNativeWindowCreated(ANativeActivity* activity, ANativeWindow* window) {
    LOGI(2, "-----onNativeWindowCreated: %p -- %p\n", activity, window);
// printInfo(activity);
}

static void onNativeWindowResized(ANativeActivity* activity, ANativeWindow* window) {
    LOGI(2, "-----onNativeWindowResized: %p -- %p\n", activity, window);
// printInfo(activity);
}

static void onNativeWindowRedrawNeeded(ANativeActivity* activity, ANativeWindow* window) {
    LOGI(2, "-----onNativeWindowRedrawNeeded: %p -- %p\n", activity, window);
// printInfo(activity);
}

static void onNativeWindowDestroyed(ANativeActivity* activity, ANativeWindow* window) {
    LOGI(2, "-----onNativeWindowDestroyed: %p -- %p\n", activity, window);
// printInfo(activity);
}

static void onInputQueueCreated(ANativeActivity* activity, AInputQueue* queue) {
    LOGI(2, "-----onInputQueueCreated: %p -- %p\n", activity, queue);
// printInfo(activity);
}

static void onInputQueueDestroyed(ANativeActivity* activity, AInputQueue* queue) {
    LOGI(2, "-----onInputQueueDestroyed: %p -- %p\n", activity, queue);
// printInfo(activity);
}

static void onContentRectChanged(ANativeActivity* activity, const ARect* rect) {
    LOGI(2, "-----onContentRectChanged: %p -- %p\n", activity, rect);
// printInfo(activity);
}

static void onConfigurationChanged(ANativeActivity* activity) {
    LOGI(2, "-----onConfigurationChanged: %p\n", activity);
// printInfo(activity);
}

static void onLowMemory(ANativeActivity* activity) {
    LOGI(2, "-----onLowMemory: %p\n", activity);
// printInfo(activity);
}

void ANativeActivity_onCreate(ANativeActivity* activity,
        void* savedState, size_t savedStateSize) {
 printInfo(activity);
 LOGI(2, "-----ANativeActivity_onCreate");
 //the callbacks the Android framework will call into a native application
 //all these callbacks happen on the main thread of the app, so we'll
 //need to make sure the function doesn't block
 activity->callbacks->onStart = onStart;
 activity->callbacks->onResume = onResume;
 activity->callbacks->onSaveInstanceState = onSaveInstanceState;
 activity->callbacks->onPause = onPause;
 activity->callbacks->onStop = onStop;
 activity->callbacks->onDestroy = onDestroy;
 activity->callbacks->onWindowFocusChanged = onWindowFocusChanged;
 activity->callbacks->onNativeWindowCreated = onNativeWindowCreated;
 activity->callbacks->onNativeWindowResized = onNativeWindowResized;
 activity->callbacks->onNativeWindowRedrawNeeded = onNativeWindowRedrawNeeded;
 activity->callbacks->onNativeWindowDestroyed = onNativeWindowDestroyed;
 activity->callbacks->onInputQueueCreated = onInputQueueCreated;
 activity->callbacks->onInputQueueDestroyed = onInputQueueDestroyed;
 activity->callbacks->onContentRectChanged = onContentRectChanged;
 activity->callbacks->onConfigurationChanged = onConfigurationChanged;
 activity->callbacks->onLowMemory = onLowMemory;

 activity->instance = NULL;
}

3. Application.mk

APP_PLATFORM := android-9

 

4. Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := NativeActivityOne
LOCAL_SRC_FILES := NativeActivityOne.cpp
LOCAL_LDLIBS    := -landroid -llog

include $(BUILD_SHARED_LIBRARY)

 

5. if want to compile to executable, change Android.mk

 

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := NativeActivityOne
LOCAL_SRC_FILES := NativeActivityOne.cpp
#LOCAL_LDLIBS    := -landroid -llog
LOCAL_LDLIBS    := -shared -landroid -llog

#include $(BUILD_SHARED_LIBRARY)
include $(BUILD_EXECUTABLE)

 

6.  Notes

这样生成的native activity 不能执行, 所以应该生成.so库, 然后用eclipse 或 命令行生成apk.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值