概要
- とりあえずな native なアプリの作り方
- Android.mk を、どっかのを真似して書けばいいだけ
方法
Android のソースツリーの package/apps の下とかにディレクトリ掘って、Android.mk を作る
以下のような感じで、どっかのを真似するLOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES := test_native.c LOCAL_SHARED_LIBRARIES := libc libcutils LOCAL_CFLAGS := -DANDROID_CHANGES # LOCAL_C_INCLUDES := # LOCAL_LDLIBS += -lpthread # LOCAL_MODULE_OWNER := # LOCAL_MODULE_TAGS := eng # LOCAL_CFLAGS += -fPIE # LOCAL_LDFLAGS += -fPIE -pie LOCAL_MODULE := test_native include $(BUILD_EXECUTABLE)
あとは、device/<manufacture>/<product>/ の下の *.mk で、
PRODUCT_PACKAGES += test_native
とか書けば、ビルド後に /system/bin の中に入ってくれる。最近の kernel だと PIE を有効にしてビルドしないと動かないか。あと、実行時に
setenforce 0
しとかないと、色々と SELinux のチェックにひかかって動かないことが多い。
log
logcat に log 出すには以下のような感じで
#include <android/log.h> #define LOG_TAG "foo" #define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)) #define LOGA(...) ((void)__android_log_print(ANDROID_LOG_FATAL, LOG_TAG, __VA_ARGS__)) #define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)) #define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__))
format 指定なら以下か
#define LOGE(fmt, ...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, fmt, ##__VA_ARGS__)
Hello, world!
#include <stdio.h>
#include <stdlib.h>
#include <android/log.h>
#define LOG_TAG "Salt"
#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__))
#define LOGA(...) ((void)__android_log_print(ANDROID_LOG_FATAL, LOG_TAG, __VA_ARGS__))
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__))
#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__))
int main(int argc, char **argv) {
LOGE("Hello, world!");
return 0;
}