Android NDK 使用第三方库

NDK r5 开始支持预编译共享库。预编译共享库就是从其他地方获得源码编译出的共享库,而不是Android系统自带的。方法如下:
1、声明共享库模块
把共享库声明为一个独立模块。假如 libfoo.so 与 Android.mk 位于同一目录。则 Android.mk 应该这样写:
    LOCAL_PATH := $(call my-dir)

    include $(CLEAR_VARS)
    LOCAL_MODULE := foo-prebuilt     # 模块名
    LOCAL_SRC_FILES := libfoo.so     # 模块的文件路径(相对于 LOCAL_PATH)

    include $(PREBUILT_SHARED_LIBRARY) # 注意这里不是 BUILD_SHARED_LIBRARY
这个共享库将被拷贝到 $PROJECT/obj/local 和 $PROJECT/libs/<abi> (strip过的)

2、在其他模块中引用这个共享库
    在 Android.mk 中,将这个共享库的模块名加入 LOCAL_STATIC_LIBRARIES (静态库)或 LOCAL_SHARED_LIBRARIES (动态库)
例如, 使用 libfoo.so 的方法:
    include $(CLEAR_VARS)
    LOCAL_MODULE := foo-user
    LOCAL_SRC_FILES := foo-user.c
    LOCAL_SHARED_LIBRARY := foo-prebuilt
    include $(BUILD_SHARED_LIBRARY)
3、为共享库导出头文件
    这个共享库一般有相应的头文件,比如 libfoo.so 就有 foo.h。

一个简单方法(在Android.mk中写):    

   include $(CLEAR_VARS)
   LOCAL_MODULE := foo-prebuilt
   LOCAL_SRC_FILES := libfoo.so
   LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
   include $(PREBUILT_SHARED_LIBRARY)
    这样,使用该共享库的模块就会在它的 LOCAL_C_INCLUDES 变量加入该头文件搜索路径。
4、调试共享库
    建议你的共享库保留调试信息。 $PROJECT/libs/<abi> 目录下的共享库都是 strip 之后的(没有调试信息)。有调试信息的版本可被ndk-gdb使用。

5、共享库 ABI
    你的共享库与目标系统ABI的兼容性很重要。
    请检查 TARGET_ARCH_ABI,有以下值:
        armeabi      =>  ARMv5TE 以上
        armeabi-v7a  =>  ARMv7 以上
        x86              =>  x86
    建议: armeabi ABI 可以运行在所有 ARM CPU 上。

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

先介绍下LOCAL_CFLAGS

LOCAL_CFLAGS += -DXXX   相当于在所有源文件中增加一个宏定义#define XXX

1、-Wall

是打开警告开关

2、-O

代表默认优化,可选:-O0不优化,-O1低级优化,-O2中级优化,-O3高级优化,-Os代码空间优化

3、-g

是生成调试信息,生成的可执行文件具有和源代码关联的可调试的信息

4、-fopenmp

OpenMp是由OpenMP Architecture Review Board牵头提出的,并已被广泛接受的,用于共享内存并行系统的多处理器程序设计的一套指导性的编译处理方案(Compiler Directive)。OpenMP支持的编程语言包括C语言、C++和Fortran;而支持OpenMp的编译器包括Sun Compiler,GNU Compiler和Intel Compiler等。OpenMp提供了对并行算法的高层的抽象描述,程序员通过在源代码中加入专用的pragma来指明自己的意图,由此编译器可以自动将程序进行并行化,并在必要之处加入同步互斥以及通信。当选择忽略这些pragma,或者编译器不支持OpenMp时,程序又可退化为通常的程序(一般为串行),代码仍然可以正常运作,只是不能利用多线程来加速程序执行。
5、-D

增加全局宏定义
6、-ffast-math  

浮点优化选项 -ffast-math:极大地提高浮点运算速度

7、-mfloat-abi=softfp 浮点运算

8、exceptions 标准库异常 

9、LOCAL_LDFLAGS =-fuse-ld=bfd

gcc编译器 CFLAGS 标志参数说明

CFLAGS = -g -O2  -Wall -Werror -Wno-unused


所对应的语言
-S
只是编译不汇编,生成汇编代码
-E
只进行预编译,不做其他处理
-g
在可执行程序中包含标准调试信息
-o file
把输出文件输出到file里
-v
打印出编译器内部编译各过程的命令行信息和编译器的版本
-I dir
在头文件的搜索路径列表中添加dir目录
-L dir
在库文件的搜索路径列表中添加dir目录
-static
链接静态库
-llibrary
连接名为library的库文件

--------------------- 
来源:CSDN 
原文:https://blog.csdn.net/smfwuxiao/article/details/6591927 

猜你喜欢

转载自blog.csdn.net/u014421422/article/details/91450302