android 动态库可以在linux上运行么,如何使用Android.mk编译动态库以及可执行文件...

在Android开发中,开发层次我认为大体上分为三个层次:

1.应用层:应用层主要通过eclipse以及android studio编写上层业务以及UI等,主要依赖于系统提供的接口。

2.framework层:此层次主要为应用层apk提供接口实现相应的功能。Framwork提供的功能可谓非常多。在Android中,大量应用了Binder进程通信,完成了各种丰富的操作。如果需要定制化系统动作,通常修改framework代码。

3.linux内核层:android是基于linux内核的。linux完成硬件底层初始化,加载驱动,初始化文件系统等操作。初始化jvm运行环境基础等。

当然,可以通过更深层次的划分充分认识Android系统。在android NDK开发中,很常使用到动态库。在这里主要介绍如何通过Android.mk编译生成自己定制化的动态库以及可执行文件。

Android.mk有其自定义的语法,相比于Makefile还是简单很多的。实际上,Android.mk是用来向构建系统描述你的资源文件的。详情可参考:http://android.mk/

下面来看一个简单的Android.mk的例子:

LOCAL_PATH := $(call my-dir)

#Android.mk通常需要定义好LOCAL_PATH,表示当前工作路径

#函数my-dir是编译系统提供的,返回当前路径

include $(CLEAR_VARS)

#这一步操作主要是清空之前定义的LOCAL_XXX开头的变量,是必须要的操作

LOCAL_C_INCLUDES:=$(LOCAL_PATH)/include

#定义源文件所需的头文件所需的目录

LOCAL_MODULE :=libhello-android

#定义编译出来的模块名

LOCAL_SHARED_LIBRARIES := liblog

#编译此模块需要依赖的动态库

LOCAL_SRC_FILES := src/hello-android.c

#定义编译模块所需的源文件

include $(BUILD_SHARED_LIBRARY)

#定义编译出来的目标文件,如动态库,静态库,jar包以及apk

#编译可执行文件,步骤和上述一样

include $(CLEAR_VARS)

LOCAL_C_INCLUDES:=$(LOCAL_PATH)/include

LOCAL_SHARED_LIBRARIES := liblog \

libhello-android

LOCAL_SRC_FILES:= src/main.c

LOCAL_MODULE:= main

include $(BUILD_EXECUTABLE)

目录结构如下:

440028a09c4ccd766893e699c2ecc3f9.png

include/hello_android.h文件内容如下:

#include#define LOG_TAG "hello_android"

void print_hello();

hello-android.c文件内容如下:

#include "hello_android.h"

void print_hello()

{

ALOGD("hello_android");

}

main.c文件内容如下:

#include "hello_android.h"

int main(void)

{

print_hello();

return 0;

}

编译输出可得到如下libhello-android.so以及main可执行文件了。

Android.mk作为android完整的编译系统的配置文件,当然还有其他选项。此文章不一一举出。由于水平有限,若有错误,恳请各位读者指正。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值