ndk学习7: 使用静态库

目录:

手工编译静态库

ndk-build编译静态库

?

手工编译静态库

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

?

需要用到的核心命令:

gcc –g –c mod1.c mod2.c mod3.c ? ? ? ? ? ? ? ? ?编译obj (debug版) ? ??

AR ?r libdemo.a mod1.o mod2.o mod3.o ? ? ? 将3个obj 添加到libdemo.a中

AR ?tv libdemo.a ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 查看libdemo.a中的obj文件

AR ?d libdemo.a mod3.o ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?将mod3.o从libdemo.a中删除

?

?

于是有编译静态库的流程:

gcc------> obj 文件---->ar----->静态库文件

?

?

编译前的准备工作:

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

?

使用ndk环境编译静态库:

环境太多,为了复用性!我们编写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)
-g -c mod1.c mod2.c mod3.c

????$(TOOLCHAINS_PREFIX)-ar r libdemo.a mod1.o mod2.o mod3.o

????$(TOOLCHAINS_PREFIX)-ar tv libdemo.a

????$(TOOLCHAINS_PREFIX)-gcc $(FLAGS)
-c $(MODALE_NAME).c -o $(MODALE_NAME).o

????$(TOOLCHAINS_PREFIX)-gcc $(FLAGS)
-o $(MODALE_NAME) $(OBJS) libdemo.a

????$(RM)
*.o

#删除所有.o文件

clean:

????$(RM)
*.o

?
?

#安装程序到手机

install:

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

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

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

?
?

#运行程序

run:

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

?

?

我们直接在使用make编译:

?

磁盘目录下生成:

hello ? ? ? ? 可执行程序

libdemo.a 静态库文件

?

使用make install安装运行程序:

3个mod成功打印出来

?

?

Eclipse下使用静态库

把上面的代码拷到Eclipse工程:

?

修改Android.mk如下: ??

LOCAL_PATH?:=?$(call?my-dir)

include?$(CLEAR_VARS)

LOCAL_MODULE????:=?mod1

LOCAL_SRC_FILES?:=?mod1.cpp

include?$(BUILD_STATIC_LIBRARY)

include?$(CLEAR_VARS)

LOCAL_MODULE????:=?mod2

LOCAL_SRC_FILES?:=?mod2.cpp

LOCAL_STATIC_LIBRARIES?:=?mod1

include?$(BUILD_STATIC_LIBRARY)

include?$(CLEAR_VARS)

LOCAL_MODULE????:=?mod3

LOCAL_SRC_FILES?:=?mod3.cpp

LOCAL_STATIC_LIBRARIES?:=?mod2

include?$(BUILD_STATIC_LIBRARY)

include?$(CLEAR_VARS)

LOCAL_MODULE????:=?Hello

LOCAL_SRC_FILES?:=?Hello.cpp

LOCAL_STATIC_LIBRARIES?:=?mod3

include?$(BUILD_EXECUTABLE)??

?

编译生成:

?

运行脚本:

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)

?
?

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 .\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即可成功执行:

?

?

?

?

?

时间: 2024-12-08 17:44:25

ndk学习7: 使用静态库的相关文章

android开发 NDK 编译和使用静态库、动态库 (转)

在eclipse工程目录下建立一个jni的文件夹 在jni文件夹中建立Android.mk和Application.mk文件 Android.mk文件: Android提供的一种makefile文件,用来指定诸如编译生成so库名.引用的头文件目录.需要编译的.c/.cpp文件和.a静态库文件等.详见附件中的Android.mk. Application.mk文件: 定义了项目的一些细节,比如APP_ABI := x86(编译X86平台库).APP_PLATFORM := android-9(使用

android开发 NDK 编译和使用静态库、动态库

在eclipse工程目录下建立一个jni的文件夹. 在jni文件夹中建立Android.mk和Application.mk文件. Android.mk文件: Android提供的一种makefile文件,用来指定诸如编译生成so库名.引用的头文件目录.需要编译的.c/.cpp文件和.a静态库文件等.详见附件中的Android.mk. Application.mk文件: 定义了项目的一些细节,比如APP_ABI := x86(编译X86平台库).APP_PLATFORM := android-9(

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 ? 程序运行会优先从系统目

NDK编译依赖opencv静态库的arm64-v8a动态库

遇到的问题:写完Android.mk和Application.mk文件,然后使用cygwin+NDK编译 总是遇到下面的编译错误: fatal error: opencv2/core.hpp: No such file or directory #include "opencv2/core.hpp" 在网上试了很多方法,都不奏效. 最终解决问题的办法是:将opencv和opencv2文件夹复制到这个目录: D:\android-ndk-r17c\sysroot\usr\include

如何使用Eclipse的NDK开发动态库,静态库

============问题描述============ 如何使用Eclipse的NDK开发动态库,静态库? Eclipse中已经安装了NDK,CDT和Esequoyah并配置(是在网上查的). 我是做C++的,公司业务需要自学Android,对Java也是知道一点皮毛. 在网上查了一些资料,我都没有成功做出最简单的动态库或静态库,郁闷啊! 有没有详细指导? ============解决方案1============ 你去搜一下Android的jni开发,就知道了,一点都不难,不过一般开发ndk

linux学习 建立静态库,动态库,写简单的makefile

建立静态库 建立四个文件 bin(可执行文件),lib(库),include(头文件),src(放源文件) 这里的起的库明为add 在src文件中执行 1)gcc -c add.c //编译add.c源文件生成add.o目标文件 2)ar crsv ../lib/ libadd.a add.o //对目标文件*.o进行归档,生成lib*.a, 把这个生成文件放在lib里 3)gcc -o main main.c -L(大些的爱偶,放库的路径)../lib   –l(小写的爱偶,库名为add) a

Linux静态库和动态库学习总结

一.废话 之前由于工作需要,要封装一个Linux加密解密转换的动态库,这个之前只做过Windows下面的,Linux下面还真没有做过,之后做了整一个晚上才算做好,不过其中也学到了不少东西,包括Linux下的动态库和静态库,MakeFile等等.之前就已经写了一个练习,之后怕又忘了,总结一下备忘,以后也好查. 很大部分内容都是收集的一些东西还有自己学习的体会,有什么错误或者问题请直接提出. 二.关于库的问题 1.库的原则 现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始.尽量不

C语言学习笔记--动态库和静态库的使用

1.C语言中的链接器 (1)每个 C 语言源文件被编译后生成目标文件,这些目标文件最终要被链接在一起生成可执行文件. (2)链接器的主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确的衔接. 2.静态链接 由链接器在链接时将库的内容直接加入到可执行程序中 ①编译静态库源码:gcc –c lib.c –o lib.o ②生成静态库文件:ar –q lib.a lib.o //将 lib.o 与其他文件打包到 lib.a 中 ③使用静态库编译:gcc main.c lib.a –

Linux学习笔记7——linux中的静态库和动态库

一.静态库的编译 静态库的编译过程如下: 1.编译成目标文件 这里有一个可选项-static,调用格式:gcc -c -static 代码文件名.c 2.归档成静态库 A.归档的工具是ar工具,使用ar -r可以将文件归档成静态库,调用格式:ar -r 静态库文件 被归档的文件 例如:我们这有两个C文件,分别为test1.c和test2.c 首先我们将它编译成目标文件:gcc -c -static test1.c gcc -c -static test2.c 此时会产生两个文件,分别为test1