代码之家  ›  专栏  ›  技术社区  ›  Reimund

如何使用Android NDK编译静态库?

  •  33
  • Reimund  · 技术社区  · 16 年前

    我正试图编译一个静态库来在Android上使用,但是我不知道如何编译它。该库使用标准库(stdio.h等)和libxml2。

    /cygdrive/c/android-ndk-r4/build/platforms/android-8/arch-x86/usr/include/asm/posix\u types.h:15:28:错误:posix\u types\u 64.h:没有这样的文件或目录

    我怎样才能让它工作?

    3 回复  |  直到 14 年前
        1
  •  50
  •   Reimund    16 年前

    据我所知,正确的方法是 ndk构建 不直接调用编译器。

    安卓.mk

    LOCAL_PATH := $(call my-dir)
    
    # Define vars for library that will be build statically.
    include $(CLEAR_VARS)
    LOCAL_MODULE := <module_name>
    LOCAL_C_INCLUDES := <header_files_path>
    LOCAL_SRC_FILES :=  <list_of_src_files>
    
    # Optional compiler flags.
    LOCAL_LDLIBS   = -lz -lm
    LOCAL_CFLAGS   = -Wall -pedantic -std=c99 -g
    
    include $(BUILD_STATIC_LIBRARY)
    
    # First lib, which will be built statically.
    include $(CLEAR_VARS)
    LOCAL_MODULE := hello-jni
    LOCAL_STATIC_LIBRARIES := <module_name>
    LOCAL_C_INCLUDES := <header_files_path>
    LOCAL_SRC_FILES := hello-jni.c
    
    include $(BUILD_SHARED_LIBRARY)
    

    如果您想控制在运行ndk build时编译哪些模块,可以创建 应用程序.mk

    APP_MODULES := <module_name_1> <module_name_2> ... <module_name_n>
    
        2
  •  9
  •   adelphus    12 年前

    用它吗?

    默认情况下,NDK只构建可执行文件和共享库(当然还有它们的依赖项)。但是,您可以通过在Application.mk中显式引用NDK来强制它构建独立的静态库。

    假设您的静态库模块是LOCAL\u module:=libXYZ,将以下行添加到 应用程序.mk (如果Android.mk不存在,则在与Android.mk相同的文件夹中创建该文件):

    APP_MODULES := XYZ
    

    注意,APP\u MODULES值不包括静态库模块名称中包含的lib前缀。

    ndk-build APP_MODULES=XYZ

        3
  •  4
  •   Lake    11 年前

    include $(BUILD_SHARED_LIBRARY)
    

    include $(BUILD_STATIC_LIBRARY)