目录:

手工编译动态库

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:\Android\android-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:\Android\android-ndk-r10b\toolchains\x86-4.6\prebuilt\windows-x86_64\bin

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

X86_GDB_SERVER := E:\Android\android-ndk-r10b\prebuilt\android-x86\gdbserver\gdbserver

 
 

# arm-linux-androideabi-4.6 path

arm_tools_path :=E:\Android\android-ndk-r10b\toolchains\arm-linux-androideabi-4.6\prebuilt\windows-x86_64\bin

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

arm_gdb_server :=E:\Android\android-ndk-r10b\prebuilt\android-arm\gdbserver\gdbserver

 
 

run_arm:

    adb push .\libs\armeabi-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 .\libs\x86\$(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 .\libs\x86\$(MODALE_NAME)
/data/local/tmp

    adb push .\libs\x86\libdemo.so /data/local/tmp

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

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

 
 

debug_x86:

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

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

    adb push .\obj\local\x86\$(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)
.\obj\local\x86\$(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 

ndk学习8: 编译动态库的更多相关文章

  1. Android:JNI与NDK(二)交叉编译与动态库,静态库

    欢迎关注公众号,第一时间获取最新文章: 本篇目录 一.前言 本篇主要以window开发环境为背景介绍一下NDK开发中需要掌握的交叉编译等基础知识,选window系统主要是照顾大多数读者,mac ,li ...

  2. Linux gcc编译(动态库,静态库)

    1. linux 库路径: /lib , /usr/lib , /usr/local/lib 2.linux 编译静态库 a.编写源文件vi pr1.c void print1(){    print ...

  3. gcc 动态编译 动态库路径

    gcc 动态编译(共享库) 动态编译的可执行文件需要附带一个的动态链接库,在执行时,需要调用其对应动态链接库中的命令优点:体积小,编译快缺点:依赖性高 代码如下: [root@74-82-173-21 ...

  4. Linux:编译动态库时遇到的错误relocation R_X86_64_32 against `a local symbol'

    编译动态库时遇到如下错误: ... ... relocation R_X86_64_32 against `a local symbol' can not be used when making a ...

  5. netsnmp编译动态库

    .编译动态库 将写完的snmp代理程序编译生成动态库 gcc -c -fpic telnetConfig.c -o telnetConfig.o -I/usr/local/net-snmp/inclu ...

  6. Linux环境编译动态库和静态库总结

    对Linux环境动态库和静态库的一些基础知识做一些总结, 首先总结静态库的编译步骤. 1 先基于.cpp或者.c文件生成对应的.o文件 2将几个.o文件 使用ar -cr命令 生成libname.a文 ...

  7. gcc 编译动态库和静态库

    Linux C 编程入门之一:gcc 编译动态库和静态库 cheungmine 2012 参考: C程序编译过程浅析 http://blog.csdn.net/koudaidai/article/de ...

  8. 【VS工程设置】 编译动态库,命令行添加参数,不使用预编译头,指定该项目链接 哪种 运行库

    编译动态库 注意: 动态库: [目标文件扩展] => .dll + [配置类型] => 动态库(.dll) 静态库: [目标文件扩展] => .lib + [ 配置类型]=> ...

  9. gflags 编译动态库

    gflags 编译动态库 这里涉及到gflags的安装,原来使用 sudo apt-get install libgflags-dev 但是后面有人在环境中下载安装了libgflags的安装包,解压后 ...

随机推荐

  1. yourphp读取不到hits

    源代码 <YP:list name="Article" order="id desc" catid="37" limit=" ...

  2. 获取ip的ip138.com

    代码: function get_onlineip() { $ch = curl_init('http://iframe.ip138.com/ic.asp'); curl_setopt($ch, CU ...

  3. AppDelegate方法中文记录

    /// 在程序启动之后,重写自定义设置的位置 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOption ...

  4. FPM打包工具

    支持的源类型包: dir: 将目录打包成所需要的类型,可以用于源码编译安装的软件包 rpm: 对rpm进行转换 gem: 对rubygem包进行转换 python: 将Python模块打包成相应的类型 ...

  5. Python基础之--常用模块

    Python 模块 为了实现对程序特定功能的调用和存储,人们将代码封装起来,可以供其他程序调用,可以称之为模块. 如:os 是系统相关的模块:file是文件操作相关的模块:sys是访问python解释 ...

  6. 如何配置virtualBox端口转发

    1,第一步登陆虚拟主机,安装openssh-server(这一步非常重要,如果不安装,你在宿主机上怎么链接都是连不上的,我当时就犯了这个错误) apt-get install openssh-serv ...

  7. 结果集(result set)解释与用法

    解释: 引用自wiki: An SQL result set is a set of rows from a database, as well as metadata about the query ...

  8. CxImage

    启动项目的时候显示此时 百度“无法启动程序cximage.lib” 得到http://tieba.baidu.com/p/1935208210把第二项设为启动项即可 为什么设置第二项为启动项呢 因为h ...

  9. zepto-selector.js简单分析

    zepto 的selector模块是对jquery扩充选择器(jquery-selector-extensions)的部分实现.比如这样的选择方法:$('div:first') 和 el.is(':v ...

  10. 第2月第1天 命令(Command)模式

    http://www.tracefact.net/Design-Pattern/Command.aspx 命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请 ...