android 怎样编译native so

本文详细介绍了如何使用Android NDK编译动态链接库(.so)文件,并将其应用于Android应用程序中。从创建源文件、编写Android.mk文件,到编译、运行及调试,涵盖了整个流程的关键步骤。

android 怎样编译native so
1)编写动态库源程序文件
这里以my_math.c 为例。首先进入/home/android/development/,该目录下创建文件夹
lib_test。若无法创建,需要更改该目录的权限,依次执行
# cd /home/android/development
# mkdir lib_test
# chmod 777 ./lib_test
# cd ./lib_test

在lib_test 下创建my_math.h h 和my_math.c 文件,如下。
/*
my_math.h 文件
*/
int add(int x, int y);
int sub(int x, int y);
/*
my_math.c 文件
*/
#include <stdio.h>
int add(int x, int y)
{
int sum = x + y;
printf("The sum of %d and %d is %d\n", x, y, sum);
return sum;
}
int sub(int x, int y)
{
int dif = x - y;
printf("The difference of %d and %d is %d\n", x, y, dif);
return dif;
}
该程序计算两个整形变量的和差并返回该值,同时打印求和信息。

2)编写Android.mk 文件//参考<http://wenku.baidu.com/view/e97d8cdc5022aaea998f0fc8.html>
在lib_test 目录下创建Android.mk 文件,内容如下
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:=\
my_math.c
LOCAL_MODULE:=libmy_math
LOCAL_PRELINK_MODULE := false
include $(BUILD_SHARED_LIBRARY)

3)编译动态库
进入lib_test 目录,用mm 命令编译动态库。
# cd /home/android/development/lib_test
# mm
编译完成之后生成的动态库文件明为$(LOCAL_MODULE).so,即libmy_math.so。该
动态库位于/home/android/out/target/product/generic/system/lib 目录下。

4)编写调用动态库的源程序
创建libtest.c 文件,内容如下。
/*
libtest.c
*/
#include <stdio.h>
#include "my_add.h"
int main()
{
add(3,4);
sub(8, 3);
printf("Done\n");
return 0;
}

4)添加Android.mk 文件
在上节的Android.mk 文件后增加如下内容。(可以备份并删除上节中的Android.mk,
重建如下Android.mk 文件)
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:=\
libtest.c
LOCAL_MODULE:=lib_test
LOCAL_SHARED_LIBRARIES:=libmy_math
include $(BUILD_EXECUTABLE)
注:LOCAL_SHARED_LIBRARIES 指明要调用的动态库文件, 这里动态库文件为
libmy_add.so,位于/home/android/out/target/product/generic/lib 目录下,编译时会自动在这个
目录下寻找该动态库文件。

5)编译
进入lib_test 目录,使用mm命令进行编译。
# cd /home/android/development/lib_test
# mm
生成的可执行文件lib_test 文件位于/home/android/out/target/product/generic/system/bin
目录下。

6)在Android 模拟器中运行
(1)启动模拟器
(2)等待模拟器初始化完成后 ,将生成的可执行程序和动态库复制到模拟器
# adb push /home/android/out/target/product/generic/system/bin/lib_test /data/data
Android 默认到动态库查找路径为/system/lib,因此需将动态库文件复制到该目录。但
/system/lib 目录为只读属性,在执行adb push 前需先执行adb remount. 命令如下:
# adb remount
#adb push /home/android/out/target/product/generic/system/lib/libmy_math.so /system/lib
(2)运行程序
# adb shell
# cd /data/data
#./lib_test

 

2. Android.mk中的各种变量,如LOCAL_MODULE,LOCAL_PRELINK_MODULE, BUILD_SHARED_LIBRARY等,可以参考<http://wenku.baidu.com/view/e97d8cdc5022aaea998f0fc8.html>, 同样可以参考android/froyo-2.2下面各个native so (如android/froyo-2.2/system/core/libzipfile)中的Android.mk

3.  编译命令,假设android/project为native so的目录,将Android.mk以及源码放在project目录
#cd   android/froyo-2.2
# . build/envsetup.sh     //第一次编译需要运行
# lunch 3                      //此处是关键,附件没有这一步,是因为使用默认的配置文件,而mt5326项目中使用是 3选项。此步骤也可以先运行lunch,然后按提示选择3.
 # cd ../project
 # mm                     //编译生成.so文件
 此处编译的native  so用的工具链是android自带的,其位置在android/froyo-2.2/prebuild/linux-x86/toolchain


怎样编译ko的问题
1:编写hello.c
#include <linux/module.h>    /* Needed by all modules */
#include <linux/kernel.h>    /* Needed for KERN_INFO */
#include <linux/init.h>        /* Needed for the macros */
static int __init hello_init(void)
{
printk(KERN_INFO "Hello, world 2\n");
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_INFO "Goodbye, world 2\n");
}
module_init(hello_init);
module_exit(hello_exit);

2:编写makefile
gnueabi-
all:
    echo $(KERNEL_DIR)
    make -C $(KERNEL_BUILD)  M=$(PWD) CROSS_COMPILE=$(DRIVER_TOOLCHAIN) ARCH=arm modules

clean:
    make -C $(KERNEL_BUILD)  M=$(PWD) clean

3:把makefile和hello.c放在 release/vm_linux/module 里面,如果你的位置不同请修改makefile中的KERNEL_BUILD

4:请在编译这个demo之前,全部编译我们的release code,以 生成依赖文件,在 release/vm_linux/module 下面直接make, 你在此目录下将得到hello.ko
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值