目录:

手工编译静态库

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

 

 

 

 

 

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

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

    在eclipse工程目录下建立一个jni的文件夹 在jni文件夹中建立Android.mk和Application.mk文件 Android.mk文件: Android提供的一种makefile文件, ...

  2. ndk学习8: 编译动态库

    目录: 手工编译动态库 ndk-build编译动态库(Eclipse环境)   手工编译静态库 老规矩还是先手工操作,知其然并知其所以然   需要用到的核心命令: gcc -g -c -fpic -W ...

  3. NDK jni 加载静态库

    加载静态库到android,静态库的提供方式有2种, a. 通过源文件来编译静态库 b. 加载已经编译好的静态库 首先我们来看,通过源文件来编译静态库,工程目录如下 第一步:我们来看我们的jni目录, ...

  4. protobuf使用NDK编译Android的静态库(工作记录)

    1.protobuf 编译过程 前提: 确保自己电脑上已经安装了cygwin + ndk, 并且NDK能够编译hello-jni成功 1.1 把protobuf 压缩包解压到protobuf文件夹下 ...

  5. Android NDK生成及连接静态库与动态库

    对于Android应用开发,大部分情况下我们使用Java就能完整地实现一个应用.但是在某些情况下,我们需要借助C/C++来写JNI本地代码.比如,在使用跨平台的第三方库的时候:为了提升密集计算性能的时 ...

  6. 【转】TI DSP C6657学习之——编译静态库.lib

    熟悉C++开发的的小伙伴都知道,我们一般代码中往往要引入许多第三方编译好的库,有些是静态链接库static library, 有些是动态链接库dll.引入库的目的一是减少代码的编译时间,二是只提供函数 ...

  7. android NDK 使用(多个)静态库生成动态库

    android NDK 使用(多个)静态库生成动态库. 1.编写Android.mk文件:如下两种方式都可以,用于NDK编译工具生成的两个.a文件来生成最终的libtwolib-second.so动态 ...

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

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

  9. NDK 链接第三方静态库的方法

    将NDK编译的第三方静态拷贝到JNI目录下,在Android.mk中添加如下代码 以openssl静态库(libcrypto-static.a)为例 第一种链接方法:LOCAL_LDFLAGS := ...

随机推荐

  1. Centos6.5安装和使用docker

    rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm yum install docke ...

  2. flask笔记---url、变量规则

    1.路由: route() 装饰器用于把一个函数绑定到一个 URL,可以动态变化 URL 的某些部分,还可以为一个函数指定多个规则,从而方便用户访问与记忆. 例子: @app.route('/') # ...

  3. Apache配置--用户认证(针对目录访问)-update2015-05-02

    通过Apache配置可以限制用户对目录的访问,会弹出像phpadmin一样的登陆框. ========================================================= ...

  4. PostSharp AOP

    使用PostSharp 在.NET 平台上实现 AOP   摘要 本文首先介绍AOP(面向方面编程)的相关概念及理论,然后介绍如何使用PostSharp框架在.NET平台上实现AOP,最后对PostS ...

  5. Orchard源码分析(5.3):EndRequest事件处理(DefaultOrchardHost.EndRequest方法)

    EndRequest事件处理的作用是处理完"处理引擎(ProcessingEngine)"中的任务(Task).           void IOrchardHost .EndR ...

  6. oracle中的连接查询与合并查询总结

    连接查询: 连接查询是指基于多张表或视图的查询.使用连接查询时,应指定有效的查询条件,不然可能会导致生成笛卡尔积.如现有部门表dept,员工表emp,以下查询因查询条件无效,而产生笛卡尔积:   (各 ...

  7. 移动端 css实现自适应正圆 ( 宽高随着手机屏幕宽度自适应 )

    序言:应朋友要求随手写了一下移动端 css实现自适应正圆 ( 宽高随着手机屏幕宽度自适应 ) ,以备后用 LESS代码: .adaptive-circle { margin: 50px auto 0; ...

  8. 【AngularJS】—— 7 模块化

    AngularJS有几大特性,比如: 1 MVC 2 模块化 3 指令系统 4 双向数据绑定 那么本篇就来看看AngularJS的模块化. 首先先说一下为什么要实现模块化: 1 增加了模块的可重用性 ...

  9. sqoop

    http://blog.csdn.net/yfkiss/article/details/8700480 http://www.cnblogs.com/admln/p/sqoop1-99-4-javaa ...

  10. JavaWeb学习总结(五十三)——Web应用中使用JavaMail发送邮件

    现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件.邮件里面的内容可能包含了我们的注册的用户名和密码以及一个激活账户的超链接等信息.今天我们也来实现一个这样的功能 ...