zoukankan      html  css  js  c++  java
  • android dlopen调用so库

    转自: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大。

  • 相关阅读:
    [py]戏说python面向对象细节
    [py]彻底细究web框架的wsgi+逻辑处理模块
    [py]access日志入mysql-通过flask前端展示
    [sql]mysql管理手头手册,多对多sql逻辑
    [py]requests+json模块处理api数据,flask前台展示
    [py]flask从0到1-模板/增删改查
    [wx]雪落香杉树人物关系图
    [py]资源搜集
    [py]python之信用卡ATM
    【Unity技巧】开发技巧(技巧篇)
  • 原文地址:https://www.cnblogs.com/lovelili/p/2389172.html
Copyright © 2011-2022 走看看