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:\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: 编译动态库的更多相关文章
- Android:JNI与NDK(二)交叉编译与动态库,静态库
欢迎关注公众号,第一时间获取最新文章: 本篇目录 一.前言 本篇主要以window开发环境为背景介绍一下NDK开发中需要掌握的交叉编译等基础知识,选window系统主要是照顾大多数读者,mac ,li ...
- Linux gcc编译(动态库,静态库)
1. linux 库路径: /lib , /usr/lib , /usr/local/lib 2.linux 编译静态库 a.编写源文件vi pr1.c void print1(){ print ...
- gcc 动态编译 动态库路径
gcc 动态编译(共享库) 动态编译的可执行文件需要附带一个的动态链接库,在执行时,需要调用其对应动态链接库中的命令优点:体积小,编译快缺点:依赖性高 代码如下: [root@74-82-173-21 ...
- 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 ...
- netsnmp编译动态库
.编译动态库 将写完的snmp代理程序编译生成动态库 gcc -c -fpic telnetConfig.c -o telnetConfig.o -I/usr/local/net-snmp/inclu ...
- Linux环境编译动态库和静态库总结
对Linux环境动态库和静态库的一些基础知识做一些总结, 首先总结静态库的编译步骤. 1 先基于.cpp或者.c文件生成对应的.o文件 2将几个.o文件 使用ar -cr命令 生成libname.a文 ...
- gcc 编译动态库和静态库
Linux C 编程入门之一:gcc 编译动态库和静态库 cheungmine 2012 参考: C程序编译过程浅析 http://blog.csdn.net/koudaidai/article/de ...
- 【VS工程设置】 编译动态库,命令行添加参数,不使用预编译头,指定该项目链接 哪种 运行库
编译动态库 注意: 动态库: [目标文件扩展] => .dll + [配置类型] => 动态库(.dll) 静态库: [目标文件扩展] => .lib + [ 配置类型]=> ...
- gflags 编译动态库
gflags 编译动态库 这里涉及到gflags的安装,原来使用 sudo apt-get install libgflags-dev 但是后面有人在环境中下载安装了libgflags的安装包,解压后 ...
随机推荐
- Xcode如何编译Debug版和Release版
在Run和Stop按钮的右边有一个工程名 点击工程名,选择Manage Schemes 选择Edit... 左侧选择Run ProjectName.app 右侧选择Info页,在Build Confi ...
- js中,还真不了解 console
参考链接: https://segmentfault.com/a/1190000000481884
- Open Yale course:Listening to Music
一.Introductionhttps://app.yinxiang.com /Home.action?offer=www_menu#n=4b034a29-986d-4914-8220-eb99c2e ...
- mysql数据表分表策略2(转)
mysql分表方法: 方法一. 做数据库集群! 主从数据库 双向热备份(或一对多的数据库实时备份策略),这样可将数据库查询分摊到几个服务器去(可跟服务器负载均衡结合起来架构) 优点:扩展性好,没有多个 ...
- RQNOJ659 计算系数
http://www.rqnoj.cn/problem/659 描述 给定一个多项式(ax + by)^k,请求出多项式展开后x^n * y^m项的系数. 格式 输入格式 共一行,包含5个整数,分别为 ...
- HITtrainning20140417题解
题目列表: ID Origin Title 10 / 15 Problem A FZU 2152 文件系统 0 / 16 Problem B FZU 2153 A simple geome ...
- 继承IDbConnection连接不同数据库
继承IDbConnection连接不同数据库 本方案可实现仅修改app.config即可连接不同数据库,但是设计数据库时需要注意各种数据库的数据类型是不一样的. 各种不同数据库的Connection. ...
- VTK初学一,a Mesh from vtkImageData
#ifndef INITIAL_OPENGL #define INITIAL_OPENGL #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRend ...
- ASP 编码转换(乱码问题解决)
ASP 编码转换(乱码问题解决) 输出前先调用Conversion函数进行编码转换,可以解决乱码问题. 注,“&参数&”为ASP的连接符,这里面很多是直接调用的数据库表字段,实际使用请 ...
- java练手 韩信点兵
Problem C 韩信点兵 时间限制:3000 ms | 内存限制:65535 KB 描述 相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排.五人一排.七人一排地变换队 ...