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 

  • 相关阅读:
    HashTable介绍
    java源码 -- HashSet
    java源码 -- AbstractList
    java源码 -- AbstractSet
    java源码 -- AbstractCollection抽象类
    java源码 --List、Set、Collection
    第五篇:SpringBoot整合Mybatis
    java源码 -- AbstractMap
    算法
    根据前序遍历和中序遍历求后序遍历
  • 原文地址:https://www.cnblogs.com/bingghost/p/5732498.html
Copyright © 2011-2022 走看看