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

40

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

我尝试使用arm-eabi-gcc编译,但是我遇到以下错误:

/cygdrive/c/android-ndk-r4/build/platforms/android-8/arch-x86/usr/include/asm/posix_types.h:15:28: error: posix_types_64.h: 没有那个文件或目录

我该如何解决这个问题?

3个回答

50

我理解的正确方法是使用ndk-build而不是直接调用编译器。

Android.mk中,您需要为要编译的每个静态库指定一个模块,然后指定您的共享库应该使用它。

以下是hello-jni示例项目修改后的Android.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 时控制编译哪些模块,可以创建一个 Application.mk 文件(与 Android.mk 在同一目录中),并像以下示例中一样列出所有模块:

APP_MODULES := <module_name_1> <module_name_2> ... <module_name_n>

我已经尝试了相同的方法,但仍然无法工作,请参见https://dev59.com/AGLVa4cB1Zd3GeqPxpIk。 - Jeegar Patel
9
你能否在不使用共享库的情况下生成一个静态库(.a文件)? - user1027169
1
使用独立工具链编译 Android 的静态库 - TMZ
使用预构建的静态库(编译Android工具链) - TMZ
解决方案的关键部分是,静态库不能在mk文件中构建,除非在第一部分构建的静态库链接的mk文件中进行第二次构建。我使用的是ndk版本'r8c'。花了我几个小时才意识到这一点。 - drlolly

9
作为对“Can you generate a static library (.a file) without a shared library that uses it?”这个问题的回答,答案是可以。
默认情况下,NDK只会构建可执行文件和共享库(当然还包括其依赖项)。但是,您可以通过在Application.mk中明确引用它来强制NDK构建一个独立的静态库。
假设您的静态库模块是LOCAL_MODULE := libXYZ,请将以下行添加到Application.mk中(如果文件不存在,则在与Android.mk相同的文件夹中创建该文件):
APP_MODULES := XYZ

注意:APP_MODULES值不包括在您的静态库模块名称中包含的lib前缀。

或者,如果您不想创建Application.mk文件,可以在命令行上指定该值:ndk-build APP_MODULES=XYZ


没有起作用...我仍然只得到了files.so文件...我正在寻找一些方法来生成files.a(静态)文件。 - Rafael Lima

4
一个很酷的技巧:如果您有一个Android.mk文件,可以从以下方式更改构建类型:
include $(BUILD_SHARED_LIBRARY)

to

include $(BUILD_STATIC_LIBRARY)

当你使用ndk-build构建库时,.a库将被输出到obj/文件夹中的各自体系结构中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接