Android NDK 如何使用自己的共享库

时间:2023-02-08 12:22:19
Import Module

NDK r5 支持预编译的共享库

所谓预编译的共享库,就是说你自己从其他地方找来的源码,编译出来的共享库。
这个共享库自己有,android 系统中没有。

使用方法如下:

1、声明一个共享库模块:

把这个共享库声明为 “一个” 独立的模块。

假如 libfoo.so 与 Android.mk 位于同一个目录。则 Android.mk 应该这样写:

    LOCAL_PATH := $(call my-dir)LOCAL_STATIC_LIBRARIES
    
    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> (stripped)

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
    
    一个简单的方法:
    
   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 上面。