android dlopen调用so库

摘要:
空隙*p;p=dlopen(“./dl2.so”,func=dlsym(p,(*func)(a,b));intmain(){inta=5,c;c=max(a,b);c);

转自:http://hi.baidu.com/mcu99/blog/item/216f1fce17e1c00b92457edd.html

以下程序在Ubuntu操作系统上,gcc编译通过。但是当我想把它们移到Android下运行时,则出现错误,问题出在什么地方尚不得而知。
(补充:该问题已经解决,详见http://hi.baidu.com/mcu99/blog/item/59ed168014b130df9023d942.html

/***********************dl1.c的内容**************************/
#include<stdio.h>
#include<dlfcn.h>
int main()
{
int a,b;
void *p;
int (*func)(int,int);
scanf("%d%d",&a,&b);
p=dlopen("./dl2.so",RTLD_NOW);
func=dlsym(p,"max");
printf("%d与%d相比,%d为大数。\n",a,b,(*func)(a,b));
dlclose(p);
}
/***********************dl1.c的内容**************************/

/***********************dl2.c的内容**************************/
#include<stdio.h>
int max(int x,int y)
{
return x>y?x:y;
}
/***********************dl2.c的内容**************************/

编译:
gcc dl2.c -shared -fPIC -o dl2.so
gcc -o dl1 -ldl dl1.c
附《生成动态链接库是否必须使用 -fPIC 的问题》文章链接
http://hi.baidu.com/han_zhi_xing/blog/item/08f0ef37a50409360a55a9b4.html

运行:
admin@admin-desktop:/abc/test$ ./dl1
2008 2012
2008与2012相比,2012为大数。

===========================

在Android下,我编写了一个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.c
LOCAL_CFLAGS=-ldl
LOCAL_PRELINK_MODULE := true
LOCAL_MODULE:= dl1
include $(BUILD_EXECUTABLE)

然后分别make dl2和make dl1,然后将编译得到的dl1和dl2.so送到模拟器中的同一目录下,但运行时出现如下错误

# ./dl1
3 5
[1] + Stopped (signal) ./dl1
#
[1] Segmentation fault ./dl1

不知道问题出在什么地方……

在这篇文章中(http://hi.baidu.com/mcu99/blog/item/216f1fce17e1c00b92457edd.html),我在Android下使用dlopen函数调用.so文件没有成功,于是只得改用在编译过程中指定.so文件的方式加以调用,这次在Android下倒是通过了。

先在(Android源码目录)/development/目录下建立一个文件夹,比如起名叫 test123

在test123目录下建立以下三个文件:test.c、max.c、Android.mk

/**************** test.c 主程序 ********************/
#include<stdio.h>
extern max(int,int);
int main()
{
int a=5,b=3,c;
c=max(a,b);
printf("%d与%d相比,%d大。\n",a,b,c);
return 0;
}

/**************** max.c 将要被编译成动态链接库 ********************/
int max(int x,int y)
{
return x>y?x:y;
}

/**************** Android.mk 是Android系统中的Makefile文件 ********************/
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_SRC_FILES:= \
max.c
LOCAL_PRELINK_MODULE := false
LOCAL_MODULE:= libmax
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
test.c
LOCAL_CFLAGS=-lmax
LOCAL_LDFLAGS:= \
-Lout/target/product/generic/obj/lib
LOCAL_SHARED_LIBRARIES := \
libmax
LOCAL_MODULE:= test
include $(BUILD_EXECUTABLE)


建立好这三个文件后,用cd命令回到Android源码目录下,执行make test。注意不是文件夹名 test123

再用命令
adb push
(Android源码目录)/out/target/product/generic/system/bin/test /data
adb push out/target/product/generic/system/lib/libmax.so /system/lib
将test程序和编译好的libmax.so送进模拟器下相应的位置,其中
libmax.so应该放到 /system/lib下,不然test找不到它,test程序就无所谓了,放在什么地方都行。

用adb shell进入
模拟器的控制台,当然事先要先把emulator启动起来,否则adb shell会失败。

进入test所在目录,./test运行
# ./test
5与3相比,5大。

免责声明:文章转载自《android dlopen调用so库》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇用openssl.exe 来生成证书windows 编译c++库的安装CURL、64位Boost下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Visual Studio Code前端Vue开发工具VS Code与调试

vscode安装 进入vscode官网(https://code.visualstudio.com/Download)vscode插件安装进入vscode官网插件商店(https://marketplace.visualstudio.com/VSCode) 安装Vetur插件,点击install,会启动vscodevue相关插件vetur 语法高亮、智能感...

python 安装新的模块

一、方法1: 单文件模块直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包,进行解压,进入模块文件夹,执行:python setup.py install 三、 方法3:easy_install 方式  先下载ez_setup.py,运行python ez_setup 进行easy_install工具...

【Linux】鸟哥的Linux私房菜基础学习篇整理(一)

最近,一直在写PPC的模拟器和汇编器,也在做设计。所以重新看了看《鸟哥的Linux私房菜》,还是有好多命令不太熟悉。就打算写几篇blog记下来。1. nl [-bnw] filename:添加行号打印参数:-b:指定行号指定的方式,主要有两种:  -b a:表示不论是否为空行,也同样列出行号(类似cat -n);  -b t:如果有空行,空的那一行不要列出...

Excel 数据对比,窗口并列排序操作(xlw文件格式的由来)

步骤1:打开Excel文件,输入一些数据 步骤2:点击视图,创建新窗口(这里就会创建一个和步骤1一抹一样的的表格,我们可以在任务栏上看到) 第三步:点击视图里面的全部重排按钮,在重拍窗口里面选择需要拍了的方式(自己选择,这里我选择垂直并排) 到这来,两个一模一样的垂直的窗口就显示出来了,如下所示 补充说明:如果我们想下次打开这个文件还是这种垂直并排...

MooseFs集群故障恢复运维

批量操作集群可以借助pssh,封装之 prun: aliased to pssh -O StrictHostKeyChecking=no -t 0 -p 90 -h hosts -l work -o out -e err master挂了怎么办 如果机器能启动起来,则恢复之。 如果ip没变,只是数据全丢失了,把期中一台metalogger服务器的meta...

python:将excel转换xml(testlink)

最近公司内部开始推行使用testlink,打算使用excel编写转换为xml,自行上传,但是最终转换出来的文件还是不能被testlink所识别 最终解决方案:使用testlink convert进行相应的转换操作。 此处仅提供excel转xml的思路:使用xlrd读取excel并存为字典,再从字典解析成xml(一个是用xmldom解析,一种是通过拼接字符串...