android notes,android notes

Android.mk notesAndroid.mk 是什么?

Android.mk 的语法编译apk

编译jar包

JNIcd项目bin\classes\ javah 包名+文件名 在当前路径生成头文件

项目跟目录新建jni把头文件放入jni文件夹 加入c文件与android.mk文件

cd jni目录下 ndk-build 编译生成.so文件

Android.mk 是什么?

Android.mk 文件用来告知 NDK Build 系统关于Source的信息。Android.mk是GNU Makefile 的一部分,并且将Build System解析一次或者多次。

但是尽量少的在Android.mk中声明变量,也不要假定任何东西不会在解析过程中定义。

Android.mk文件语法允许我们将Source打包成一个‘modules’,‘modules’可以是:动态库,静态库。

只有动态库可以被 install/copy到应用程序包(APK),静态库则可以被链接入动态库。可以在一个Android.mk中定义一个或多个modules;也可以将同一份source 加进多个modules。

Build System帮我们处理了很多细节而不需要我们再关心。例如:你不需要在Android.mk中列出头文件和外部依赖文件。

NDK Build System自动帮我们提供这些信息。这也意味着,当用户升级NDK后,你将可以受益于新的toolchain/platform而不必再去修改Android.mk.

Android.mk 的语法

LOCAL_PATH:= $(call my-dir)

每个Android.mk文件必须定义LOCAL_PATH为开始,它用于在开发tree中查找源文件,宏my-dir则由build System提供。返回包含Android.mk的目录路径。

include $(CLEAR_VARS)

CLEAR_VARS 变量由Build  System提供。并指向一个指定的GNU Makefile,由它负责清理很多LOCAL_XXX. 例如:LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES等等。

但是不清理LOCAL_PATH。这个清理动作是必须的,因为所以的编译控制文件由同一个GNU Make解析和执行,其变量是全局的。所以清理后才能避免相互影响。

LOCAL_MODULE := XXXXXX

LOCAL_MODULE 必须定义,以表示Android.mk中的每一个模块,名字必须唯一,不能包含空格。

LOCAL_MODULE_TAGS := optional

LOCAL_MODULE_TAGS  是指定在什么版下才会编译这个Android.mk

user: 指该模块只在user版本下才编译

eng: 指该模块只在eng版本下才编译

tests: 指该模块只在tests版本下才编译

optional:指该模块在所有版本下都编译

LOCAL_SRC_FILES := $(LOCAL_MODULE).apk

LOCAL_SRC_FILES变量必须包含将要打包如模块的C/C++ 源码,这里将模块打包为apk包

LOCAL_MODULE_CLASS := APPS

LOCAL_MODULE_CLASS 标识了所编译模块最后放置的位置,如果不指定,不会放到系统中,之后放在最后的obj目录下的对应目录中。

LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)

指定当前模块的后缀。一旦指定,系统在产生目标文件时,会以模块名加后缀来创建目标文件

LOCAL_PRIVILEGED_MODULE := true

LOCAL_PRIVILEGED_MODULE 是Android ROM编译时的一个变量,其与编译、安装、权限管理等几个方面都有关系。对于Android系统应用,

LOCAL_PRIVILEGED_MODULE 决定了其编译后的在ROM中的安装位置: 如果不设置或者设为false,安装位置为system/app; 如果设置为true,安装位置为system/priv-app。

LOCAL_CERTIFICATE := PRESIGNED

LOCAL_CERTIFICATE指apk的签名,可以有:

media    使用media签名文件签名

platform 使用平台签名文件签名

shared   使用shared签名文件签名

PRESIGNED 如果文件已经签过名,不需要重新签名,则使用PRESIGNED。

LOCAL_PREBUILT_JNI_LIBS := \ XXXX  、LOCAL_MULTILIB :=32

因为Android5.1 是64位编译环境,因此需要将32位的so库提取出来,使用的32位的lib库,提取出来的lib库,放在/system/priv-app/app文件名/下

include $(BUILD_PREBUILT)

BUILD_PREBUILT               :该模块已经预先编译

它负责收集自从上次调用 include $(CLEAR_VARS)  后的所有LOCAL_XXX信息。并决定编译为什么。

BUILD_STATIC_LIBRARY     :编译为静态库。

BUILD_SHARED_LIBRARY    :编译为动态库

BUILD_EXECUTABLE           :编译为Native C可执行程序

BUILD_SHARED_LIBRARY    :是Build System提供的一个变量,指向一个GNU Makefile Script。

NDK还定义了很多其他的BUILD_XXX_XXX变量,它们用来指定模块的生成方式。

$(call my-dir):获取当前文件夹路径。

$(call all-java-files-under, ):获取指定目录下的所有 Java 文件。

$(call all-c-files-under, ):获取指定目录下的所有 C 语言文件。

$(call all-Iaidl-files-under, ) :获取指定目录下的所有 AIDL 文件。

$(call all-makefiles-under, ):获取指定目录下的所有 Make 文件。

$(call intermediates-dir-for, , , , ):获取 Build 输出的目标文件夹路径。

编译apk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_PACKAGE_NAME := WistarHdmi

LOCAL_MODULE_TAGS := optional

LOCAL_DEX_PREOPT := false

LOCAL_SRC_FILES := $(call all-java-files-under, src)

LOCAL_CERTIFICATE := platform

ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 26 && echo OK),OK)

LOCAL_PROPRIETARY_MODULE := true

endif

LOCAL_JAVA_LIBRARIES := droidlogic droidlogic-tv

LOCAL_STATIC_JAVA_LIBRARIES := \

common \

asv4

LOCAL_RESOURCE_DIR := \

$(LOCAL_PATH)/res \

$(TOP)/frameworks/support/v17/leanback/res \

frameworks/support/v7/preference/res \

frameworks/support/v14/preference/res \

frameworks/support/v17/preference-leanback/res \

frameworks/support/v7/appcompat/res \

$(TOP)/frameworks/support/v7/recyclerview/res

LOCAL_AAPT_FLAGS := --auto-add-overlay \

--extra-packages android.support.v17.leanback:android.support.v7.preference:android.support.v14.preference:android.support.v17.preference:android.support.v7.appcompat:android.support.v7.recyclerview

include $(BUILD_PACKAGE)

include $(CLEAR_VARS)

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := common:libs/com.wistar.common.jar \

asv4:libs/android-support-v4.jar

include $(BUILD_MULTI_PREBUILT)

编译jar包

LOCAL_PATH:= $(call my-dir)

# the library

# ============================================================

include $(CLEAR_VARS)

LOCAL_SRC_FILES := \

$(call all-subdir-java-files)

LOCAL_MODULE := droidlogic

LOCAL_MODULE_CLASS := JAVA_LIBRARIES

LOCAL_DX_FLAGS := --core-library

LOCAL_JACK_ENABLED := disabled

include $(BUILD_STATIC_JAVA_LIBRARY) #编译jar包

#include $(BUILD_JAVA_LIBRARY)

JNI

static{

System.loadLibrary("HelloJNI");

}

public static native String helloJNI();

public static native int sum(int x,int y);

cd项目bin\classes\ javah 包名+文件名 在当前路径生成头文件

项目跟目录新建jni把头文件放入jni文件夹 加入c文件与android.mk文件

LOCAL_PATH := $(call my-dir)

// 设置工作目录,而my-dir则会返回Android.mk文件所在的目录

include $(CLEAR_VARS)

// 清除几乎所有以LOCAL——PATH开头的变量(不包括LOCAL_PATH)

LOCAL_MODULE := hello_jni

// 设置模块的名称,即编译出来.so文件名

// 注,要和上述步骤中build.gradle中NDK节点设置的名字相同

LOCAL_SRC_FILES := test.cpp

// 指定参与模块编译的C/C++源文件名

include $(BUILD_SHARED_LIBRARY)

// 指定生成的静态库或者共享库在运行时依赖的共享库模块列表。

cd jni目录下 ndk-build 编译生成.so文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值