嵌入式Linux支持dlopen,Android下使用dlopen函数动态调用.so链接库

本文详细介绍了如何在Android环境下使用dlopen函数动态调用.so链接库,通过修改Android.mk文件成功解决之前遇到的问题。关键在于正确链接libdl.so,并确保编译配置正确。最终在Android源码目录下编译生成了可执行文件和动态链接库,并通过adb推送到Android模拟器进行执行。
摘要由CSDN通过智能技术生成

在这篇文章(【09.03.25】Linux环境中dlopen函数的简单应用)中。实现了在UBUNTU LINUX环境下使用dlopen函数动态调用.so链接库。但是也提到了在Android下未能成功。由于Android也是使用linux内核,因此估计程序本身可能并没有什么错误,问题应该是出现在Android.mk文件中。今天早上试着修改了一下Android.mk,终于将这个问题解决了。好在两个C程序和一个.mk文件并不是太长,现将它们贴一遍/*************************** dl1.c *******************************/

#include#include#includeint main()

{

int a,b;

void *p;

int (*func)(int,int);

scanf("%d%d",&a,&b);

p=dlopen("./dl2.so",RTLD_NOW);

if(p==NULL)

{

printf("dlopen error!\n");

exit(0);

}

else

printf("dlopen ok!\n");

func=dlsym(p,"max");

printf("%d与%d相比,%d为大数。\n",a,b,(*func)(a,b));

dlclose(p);

}

/*************************** dl1.c *******************************//*************************** dl2.c *******************************/

#includeint max(int x,int y)

{

return x>y?x:y;

}

/*************************** dl2.c *******************************//*************************** Android.mk *******************************/

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES:= \

dl2.c

LOCAL_PRELINK_MODULE := true

#LOCAL_CFLAGS=-fPIC

LOCAL_MODULE:= dl2

include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_SRC_FILES:= \

dl1.cLOCAL_SHARED_LIBRARIES := \

libdl#LOCAL_CFLAGS=-ldl

LOCAL_PRELINK_MODULE := true

LOCAL_MODULE:= dl1

include $(BUILD_EXECUTABLE)

/*************************** Android.mk *******************************/上一次之所以失败,原因似乎是使用了红色字体的那一句,因为我将其更换为蓝色字体的那一句,问题就解决了。看来这样写在链接时才能正确找到libdl.so,而包含该.so文件是使用dlopen函数的保证。将这三个文件放在Android源码目录下的development目录下的dl文件夹中(dl文件夹是新建的),然后在终端中使用root权限进入到Android源码目录下,执行 make dl1。成功后将会在android源码目录/out/target/product/generic/system/lib/中生成dl2.so动态链接库文件,在android源码目录/out/target/product/generic/system/bin/中生成dl1可执行文件。使用以下命令将它们放入Android模拟器,注意要先启动emulatoradb push Android源码目录/out/target/product/generic/system/lib/dl2.so /dataadb push Android源码目录/out/target/product/generic/system/bin/dl1 /data进入data文件夹执行adb shell# cd data# ./dl187 9(这里随便输入两个数)dlopen ok!87与9相比,87为大数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值