如何在ndk build中使用自定义工具链? 我花了一天时间,似乎无法为支持标准C++库的NDK工具链配置我的DEV环境。故事是我试图交叉编译ARM(Android)的libnfnetlink和libnetfilter_队列

如何在ndk build中使用自定义工具链? 我花了一天时间,似乎无法为支持标准C++库的NDK工具链配置我的DEV环境。故事是我试图交叉编译ARM(Android)的libnfnetlink和libnetfilter_队列,android,android-ndk,netfilter,Android,Android Ndk,Netfilter,首先,我使用以下方法: Nexus 5和CyanogenMod 11(我忘了,没关系,我甚至还没有在设备上) Ubuntu 12.04 32位 Android SDK捆绑包:adt-bundle-linux-x86-20140702 Android NDK:Android-NDK-r10c 有一个很好的博客介绍了这一点,但它并不完整,因为Netfilter使用stlc++并且没有任何关于NDK安装/设置的消息可以简单地调用NDK build。仅将文件复制到/jni并调用ndk build无法

首先,我使用以下方法:

  • Nexus 5和CyanogenMod 11(我忘了,没关系,我甚至还没有在设备上)
  • Ubuntu 12.04 32位
  • Android SDK捆绑包:adt-bundle-linux-x86-20140702
  • Android NDK:Android-NDK-r10c
有一个很好的博客介绍了这一点,但它并不完整,因为Netfilter使用stlc++并且没有任何关于NDK安装/设置的消息可以简单地调用NDK build。仅将文件复制到/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包含在我的工具链中,我搜索了它。就在那里:

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构建获得config.h

我已经读到ndk build命令利用了Google在ndk中包含的config.mk/setup.mk,必须进行修改以指向另一个工具链

谷歌自己的工具不能简单地指向一个定制的工具链,他们会给你脚本来创建。如果有人对我如何使用工具链编译Netfilter或一般来说有任何建议,那将是一个很大的帮助


提前感谢!

当我在网上搜索
libnetfilter\u queue.c
版本时,我找不到对
internal.h
config.h
的任何引用,所以我不确定您使用的是哪个版本的文件-您能指出您使用的是哪个版本吗

此外,它查找的
config.h
不是您在工具链中找到的(应该作为
linux/config.h
包含),但很可能是您希望通过运行
configure
脚本生成的(或者从其他地方预生成
config.h
)您无法真正构建它


<>最后,这与LISSTDC++无关,因为所有的源文件看起来都是纯C,不是C++。< /P>你说得对。这太尴尬了!我从克隆的LBETFieldEngRead(1.0.2)和LIbfNETLink(1.0.1)中抓取了最新的NETFISH源。。似乎我应该从下载链接中获取它。git源代码中缺少配置脚本!我现在可以很好地构建它了。感谢您的提示。
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)