Menu Home

Android: 在framework中增加Native库

OS: Android 4.4.2

在framework层使用Native lib和在application层的使用有所不同,主要集中在如何正确书写Android.mk和各种依赖关系,要比直接ndk-build麻烦一些。

场景: 在SystemUI包中添加一个Native库,假设名字为libxx.so

处理步骤:

  1. 进到frameworks/base/packages/SystemUI下创建JNI文件夹,这里存放所有libxx.so需要的文件。
    假设源文件名为xx.c。建立Android.mk文件,文件内容如下:

    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    
    LOCAL_LDFLAGS := -llog -ljnigraphics
    LOCAL_MODULE    := libxx
    LOCAL_SRC_FILES := xx.c
    LOCAL_CFLAGS    =  -ffast-math -O3 -funroll-loops
    
    ifeq ($(TARGET_ARCH), arm)
            LOCAL_SDK_VERSION := 9
    endif
    
    ifeq ($(TARGET_ARCH), x86)
            LOCAL_SDK_VERSION := 9
    endif
    
    ifeq ($(TARGET_ARCH), mips)
            LOCAL_SDK_VERSION := 9
    endif
    
    include $(BUILD_SHARED_LIBRARY)
    

    注意,如果要将libxx.so文件编译到system image,需要修改LOCAL_MODULE_TAGS(如果有),这个值必须为user,而不是samples,或者干脆去掉这个变量 。因为如果没有指定LOCAL_MODULE_TAGS,该项默认为user

  2. 为了能在编译SystemUI的时候自动编译libxx.so,需要在SystemUI的Android.mk文件中加入如下内容:

    ifneq (,$(TARGET_BUILD_APPS))
      LOCAL_JNI_SHARED_LIBRARIES := libxx
    else
      LOCAL_REQUIRED_MODULES := libxx
    endif
    

    Android对上面语句的解释如下:

    If this is an unbundled build (to install seprately) then include
    the libraries in the APK, otherwise just put them in /system/lib and
    leave them out of the APK
    
  3. 可以用make systemimage和mm SystemUI来测试效果。