概要

  • とりあえずな 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;
}