zoukankan      html  css  js  c++  java
  • ndk学习8: 编译动态库

    目录:

    手工编译动态库

    ndk-build编译动态库(Eclipse环境)

     

    手工编译静态库

    老规矩还是先手工操作,知其然并知其所以然

     

    需要用到的核心命令:

    gcc -g -c -fpic -Wall mod1.c mod2.c mod3.c

    gcc -g  -shared mod1.o mod2.o mod3.o -o libfoo.so

    gcc -g  -fpic -Wall -shared mod1.o mod2.o mod3.o -o libfoo.so

     

    程序运行会优先从系统目录找共享库,如果找不到才会去LD_LIBRARY_PATH环境变量中搜索

     

     

    编译前的准备工作:

    目标:我们打算将如上4个c文件编译成一个可执行文件,并使用

     

     

    编写makefile文件:

    #ndk根目录

    NDK_ROOT=E:Androidandroid-ndk-r10b

    #编译器根目录

    TOOLCHAINS_ROOT=$(NDK_ROOT)/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64

    #编译器目录

    TOOLCHAINS_PREFIX=$(TOOLCHAINS_ROOT)/bin/arm-linux-androideabi

    #头文件搜索路径

    TOOLCHAINS_INCLUDE=$(TOOLCHAINS_ROOT)/lib/gcc/arm-linux-androideabi/4.6/include-fixed

    #SDK根目录

    PLATFROM_ROOT=$(NDK_ROOT)/platforms/android-14/arch-arm

    #sdk头文件搜索路径

    PLATFROM_INCLUDE=$(PLATFROM_ROOT)/usr/include

    #sdk库文件搜索路径

    PLATFROM_LIB=$(PLATFROM_ROOT)/usr/lib

    #文件名称

    MODALE_NAME=hello

    #删除

    RM=del

    #编译选项

    FLAGS=-I$(TOOLCHAINS_INCLUDE)

    -I$(PLATFROM_INCLUDE)

    -L$(PLATFROM_LIB)

    -nostdlib

    -lgcc

    -Bdynamic

    -lc

       

    #所有obj文件

    OBJS=$(MODALE_NAME).o

    $(PLATFROM_LIB)/crtbegin_dynamic.o

    $(PLATFROM_LIB)/crtend_android.o

       

    #编译器链接

    all:

        $(TOOLCHAINS_PREFIX)-gcc $(FLAGS) -Wall -fpic -g -c mod1.c mod2.c mod3.c

        $(TOOLCHAINS_PREFIX)-gcc $(FLAGS) -g -shared mod1.o mod2.o mod3.o -o libDemo.so

        $(TOOLCHAINS_PREFIX)-gcc $(FLAGS) -g -c $(MODALE_NAME).c

        $(TOOLCHAINS_PREFIX)-gcc -g -Wall $(FLAGS) $(OBJS) libDemo.so -o $(MODALE_NAME)

        rm -f *.o

    #删除所有.o文件

    clean:

    # 使用cmd命令 del

        rm -f *.o

       

    #安装程序到手机

    install:

        adb push $(MODALE_NAME) /data/local/tmp

        adb push libDemo.so /data/local/tmp

        adb shell chmod 755 /data/local/tmp/$(MODALE_NAME)

    #    adb shell export LD_LIBRARY_PATH=/data/local/tmp

        adb shell /data/local/tmp/$(MODALE_NAME)

       

    #运行程序

    run:

        adb shell /data/local/tmp/$(MODALE_NAME)

     

     

    编译:

    输入make编译

     

    运行:

    输入make install安装尝试运行

     

    报错: 找不到共享库

     

    由于export只能用于当前shell 所以我没有没法在make file里面使用

    或者你当前环境root,配置全局的LD_LIBRARY_PATH环境变量也可以

     

    解决方案:

    进入adb shell执行

     

    export LD_LIBRARY_PATH=/data/local/tmp  

    echo $LD_LIBRARY_PATH

    /data/local/tmp/hello 

       

     

    用Eclipse编译共享库

     

    修改android.mk:

    LOCAL_PATH :$(call my-dir)

    include $(CLEAR_VARS)

    LOCAL_MODULE    := demo

    LOCAL_SRC_FILES := mod1.cpp mod2.cpp mod3.cpp

    include $(BUILD_SHARED_LIBRARY)

    include $(CLEAR_VARS)

    LOCAL_MODULE    := Hello

    LOCAL_SRC_FILES := Hello.cpp

    LOCAL_SHARED_LIBRARIES := demo

    include $(BUILD_EXECUTABLE)  

     

     

    LOCAL_SRC_FILES := mod1.cpp mod2.cpp mod3.cpp 指明编译源码文件

    BUILD_SHARED_LIBRARY 指明编译的目标为共享库

    LOCAL_SHARED_LIBRARIES := demo  在编译的可执行对象中加入共享库

     

     

    在工程目录下新建makefile:

    MODALE_NAME := Hello

       

    # x86 path

    X86_TOOLS_PATH :=E:Androidandroid-ndk-r10b oolchainsx86-4.6prebuiltwindows-x86_64in

    X86_GDB_PATH := $(X86_TOOLS_PATH)i686-linux-android-gdb.exe

    X86_GDB_SERVER := E:Androidandroid-ndk-r10bprebuiltandroid-x86gdbservergdbserver

       

    # arm-linux-androideabi-4.6 path

    arm_tools_path :=E:Androidandroid-ndk-r10b oolchainsarm-linux-androideabi-4.6prebuiltwindows-x86_64in

    arm_4_6_path := $(arm_tools_path)arm-linux-androideabi-gdb.exe

    arm_gdb_server :=E:Androidandroid-ndk-r10bprebuiltandroid-armgdbservergdbserver

       

    run_arm:

        adb push .libsarmeabi-v7a$(MODALE_NAME) /data/local/tmp

        adb shell chmod 755 /data/local/tmp/$(MODALE_NAME)

        adb shell /data/local/tmp/$(MODALE_NAME)

       

    run_x86:

        adb push .libsx86$(MODALE_NAME) /data/local/tmp

        adb shell chmod 755 /data/local/tmp/$(MODALE_NAME)

        adb shell /data/local/tmp/$(MODALE_NAME)

       

    run_x86_share:

        adb push .libsx86$(MODALE_NAME) /data/local/tmp

        adb push .libsx86libdemo.so /data/local/tmp

        adb shell chmod 755 /data/local/tmp/$(MODALE_NAME)

        adb shell /data/local/tmp/$(MODALE_NAME)

       

    debug_x86:

        adb forward tcp:12345 tcp:12345

        adb push $(X86_GDB_SERVER) /data/local/tmp

        adb shell chmod 777 /data/local/tmp/gdbserver

        adb push .objlocalx86$(MODALE_NAME) /data/local/tmp

        adb shell chmod 777 /data/local/tmp/$(MODALE_NAME)

        adb shell /data/local/tmp/gdbserver :12345 /data/local/tmp/$(MODALE_NAME)

       

    client_x86:

        $(X86_GDB_PATH) .objlocalx86$(MODALE_NAME)

    # 1. target remote localhost:12345

    # 2. gdb.setup

     

    使用make run_x86_share安装运行

     

    同上面的方法一样: 

    adb shell

    export LD_LIBRARY_PATH=/data/local/tmp  

    echo $LD_LIBRARY_PATH

    /data/local/tmp/Hello 

  • 相关阅读:
    Quicksum -SilverN
    uva 140 bandwidth (好题) ——yhx
    uva 129 krypton factors ——yhx
    uva 524 prime ring problem——yhx
    uva 10976 fractions again(水题)——yhx
    uva 11059 maximum product(水题)——yhx
    uva 725 division(水题)——yhx
    uva 11853 paintball(好题)——yhx
    uva 1599 ideal path(好题)——yhx
    uva 1572 self-assembly ——yhx
  • 原文地址:https://www.cnblogs.com/bingghost/p/5732498.html
Copyright © 2011-2022 走看看