我花了一天时间在这上面,似乎无法为我的开发环境配置支持标准C ++库的NDK工具链。故事是我试图为ARM(Android)交叉编译libnfnetlink和libnetfilter_queue。
首先,我使用以下内容:
有一个很棒的博客关于这个here,但它不完整,因为Netfilter使用stlc ++,并且在NDK安装/设置上没有任何关于简单地调用ndk-build的信息。只需将文件复制到/ jni并调用ndk-build就不会单独工作。
无论如何,我的具体问题是当我直接将Netfilter lib源代码结构复制到一个空的Project' s / 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&#39的博客:
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有任何建议,或者只是一般情况下这将是一个很好的帮助。
提前致谢!
答案 0 :(得分:0)
当我在网上搜索internal.h
的版本时,我找不到对config.h
或libnetfilter_queue.c
的任何引用,所以我不确定是什么您正在使用的文件的版本 - 您能指出您拥有的文件吗?
此外,它所查找的config.h
不是您在工具链中找到的linux/config.h
(应该包含在configure
中),但最有可能是您预期的那个通过运行config.h
脚本生成。因此,除非您运行配置脚本(或者从其他地方获得预生成的{{1}}),否则您无法真正构建它。
最后,这与libstdc ++没有任何关系,因为你的所有源文件似乎都是纯C而不是C ++。