【问题标题】:How to use a custom toolchain with ndk-build?如何在 ndk-build 中使用自定义工具链?
【发布时间】:2014-11-26 18:57:06
【问题描述】:

我在这方面花了一天时间,似乎无法为支持标准 C++ 库的 NDK 工具链配置我的开发环境。故事是我正在尝试为 ARM(Android)交叉编译 libnfnetlink 和 libnetfilter_queue。

首先我使用以下内容:

  • 带有 CyanogenMod 11 的 Nexus 5(我忘了,没关系,我什至还没有使用该设备)
  • Ubuntu 12.04 32 位
  • Android SDK 包:adt-bundle-linux-x86-20140702
  • Android NDK:android-ndk-r10c

有一个很棒的博客 here 但它不完整,因为 Netfilter 使用 stlc++ 并且没有关于只需调用 ndk-build 即可工作的 NDK 安装/设置的消息。仅将文件复制到 /jni 并调用 ndk-build 不会单独工作。

无论如何,我的具体问题是当我直接将 Netfilter lib 源结构复制到一个空的项目的 /jni 目录中时,我得到了这个:

user@ubuntu:~/Projects/NetfilterTest/NetfilterNativeTest/jni$ ndk-build
[armeabi] Compile thumb  : netfilter_queue <= libnetfilter_queue.c
In file included from /home/user/Projects/NetfilterTest/NetfilterNativeTest/jni/libnetfilter_queue/src/libnetfilter_queue.c:35:0:
/home/user/Projects/NetfilterTest/NetfilterNativeTest/jni/libnetfilter_queue/src/internal.h:4:20: fatal error: config.h: No such file or directory
compilation terminated.
make: *** [/home/user/Projects/NetfilterTest/NetfilterNativeTest/obj/local/armeabi/objs/netfilter_queue/libnetfilter_queue/src/libnetfilter_queue.o] Error 1

找不到 config.h 文件。经过一番谷歌搜索后,我意识到这是因为标准 C++ 库在预构建的工具链中不可用。

一切都指向我创建自己的工具链。因此,我使用 NDK 包含的脚本构建了自己的交叉编译器。

cd /home/user/android-ndk-r10c/build/tools
./make-standalone-toolchain.sh --platform=android-19 --ndk-dir=/home/user/android-ndk-r10c/ --install-dir=/home/user/android-ndk-r10c/prebuilt/android-arm/android-19

为了确认 config.h 包含在我的工具链中,我搜索了它。它在那里:

user@ubuntu:~/Projects/NetfilterTest/NetfilterNativeTest/jni$ find /home/user/android-ndk-r10c/prebuilt/android-arm/android-19/ -iname config.h
/home/user/android-ndk-r10c/prebuilt/android-arm/android-19/sysroot/usr/include/linux/config.h

当然我需要设置我的环境和 Android.mk

JAVA_HOME=/usr/local/java/jdk1.6.0_45
JRE_HOME=$JAVA_HOME/jre
ANDROID_SDK=/home/user/adt-bundle-linux-x86-20140702
ANDROID_NDK=/home/user/android-ndk-r10c
ANDROID_CHAIN=/home/user/android-ndk-r10c/prebuilt/android-arm/android-19

PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$ANDROID_SDK/sdk/platform-tools:$ANDROID_SDK/sdk/tools:$ANDROID_NDK:$ANDROID_CHAIN/bin

SYSROOT=$ANDROID_NDK/platforms/android-19/arch-arm

CC=arm-linux-androideabi-gcc

export CC
export ANDROID_SDK
export ANDROID_NDK
export SYSROOT
export JAVA_HOME
export JRE_HOME
export PATH

这是我的 Android.mk(基于 Roman10 的博客:

LOCAL_PATH:=$(call my-dir)

#####################################################################
#                     build libnflink                               #
#####################################################################
include $(CLEAR_VARS)
LOCAL_MODULE:=nflink
LOCAL_C_INCLUDES:= $(LOCAL_PATH)/libnfnetlink/include
LOCAL_SRC_FILES:=\
    libnfnetlink/src/iftable.c \
    libnfnetlink/src/rtnl.c \
    libnfnetlink/src/libnfnetlink.c

include $(BUILD_STATIC_LIBRARY)

#####################################################################
#                   build libnetfilter_queue                        #
#####################################################################

include $(CLEAR_VARS)
LOCAL_C_INCLUDES := $(LOCAL_PATH)/libnfnetlink/include \
    $(LOCAL_PATH)/libnetfilter_queue/include
LOCAL_MODULE:=netfilter_queue
LOCAL_SRC_FILES:=libnetfilter_queue/src/libnetfilter_queue.c
LOCAL_STATIC_LIBRARIES:=libnflink

include $(BUILD_STATIC_LIBRARY)

#####################################################################
#                     build our code                                #
#####################################################################

include $(CLEAR_VARS)
LOCAL_C_INCLUDES := $(LOCAL_PATH)/libnfnetlink/include \
    $(LOCAL_PATH)/libnetfilter_queue/include
LOCAL_MODULE:=nfqnltest
#LOCAL_LDLIBS:=-lstdc++
LOCAL_SRC_FILES:=nfqnl_test.c
LOCAL_STATIC_LIBRARIES:=libnetfilter_queue
LOCAL_LDLIBS:=-llog -lm

include $(BUILD_EXECUTABLE)

我仍然使用 ndk-build 找不到 config.h。

我了解到 ndk-build 命令利用了 Google 包含在 NDK 中的 config.mk/setup.mk,并且必须对其进行修改以指向替代工具链。

我完全惊呆了,Google 自己的工具不能简单地指向自定义工具链,他们会为您提供脚本来创建。如果有人对我如何使用我的工具链编译 Netfilter 有任何建议,或者一般来说,这将是一个很大的帮助。

提前致谢!

【问题讨论】:

    标签: android android-ndk netfilter


    【解决方案1】:

    当我在网络上搜索 libnetfilter_queue.c 的版本时,我找不到对 internal.h 或 config.h 的任何引用,所以我不确定您使用的是哪个版本的文件 - 可以你指的是你有哪一个?

    此外,它寻找的config.h 不是您在工具链中找到的那个(应该包含在linux/config.h 中),但很可能是您通过运行configure 生成的那个脚本。因此,除非您运行了配置脚本(或从其他地方预先生成了 config.h),否则您无法真正构建它。

    最后,这与 libstdc++ 无关,因为您的所有源文件似乎都是纯 C,而不是 C++。

    【讨论】:

    • 你说得对。这很尴尬!我从git.netfilter.org 克隆了 libnetfilter_queue (1.0.2) 和 libnfnetlink (1.0.1) 获取了最新的 netfilter 源。看来我应该从下载链接中获取它。 git 源代码中缺少配置脚本!我现在可以很好地构建它。感谢您的提示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 2017-01-16
    • 1970-01-01
    相关资源
    最近更新 更多