我如何为 Android NDK 构建配置 Dropbear SSH?

How can I configure Dropbear SSH for Android NDK build?

我正在尝试从我的 Macintosh OS X Yosemite 和 Android NDK v10 和 Eclipse 交叉编译 Dropbear SSH 客户端,以便我的 Android 应用程序能够SSH到另一台机器。我使用的是最新版本的 Dropbear,2014.66。我一直在研究如何正确地 运行 configure 为这个 Android 构建生成一些文件。到目前为止,我是这样调用 configure 的:

PATH=/Users/me/Development/android-ndk-r10d/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64/bin/:$PATH;
./configure --host=arm-linux-androideabi --disable-zlib

但是,它失败并输出:

checking for arm-linux-androideabi-gcc... arm-linux-androideabi-gcc
checking whether the C compiler works... no
configure: error: in `/Users/me/sds/flume/android/workspace/jni/dropbear':
configure: error: C compiler cannot create executables
See `config.log' for more details

所以我没有正确设置交叉编译环境。如何设置我的环境以便设置 NDK,以便 gcc 和任何其他所需的构建工具都在我的路径中?

一旦我 configure 正确 运行,我将使用我基于 v0.52 Android 端口创建的 Android.mk Dropbear 以及 ndk-build 命令:

# jni/botan/Android.mk:
LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := dropbear
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)
LOCAL_SRC_FILES:=\
    dbutil.c buffer.c \
    dss.c bignum.c \
    signkey.c rsa.c random.c \
    queue.c \
    atomicio.c compat.c  fake-rfc2553.c
LOCAL_SRC_FILES+=\
    common-session.c packet.c common-algo.c common-kex.c \
    common-channel.c common-chansession.c termcodes.c \
    tcp-accept.c listener.c process-packet.c \
    common-runopts.c circbuffer.c

# loginrec.c 
LOCAL_SRC_FILES+=\
    cli-algo.c cli-main.c cli-auth.c cli-authpasswd.c cli-kex.c \
    cli-session.c cli-service.c cli-runopts.c cli-chansession.c \
    cli-authpubkey.c cli-tcpfwd.c cli-channel.c cli-authinteract.c
LOCAL_SRC_FILES+=netbsd_getpass.c

LOCAL_STATIC_LIBRARIES := libtommath libtomcrypt

LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
LOCAL_MODULE_TAGS := debug
LOCAL_MODULE := dropbear
LOCAL_C_INCLUDES += $(LOCAL_PATH)/libtommath 
LOCAL_C_INCLUDES += $(LOCAL_PATH)/libtomcrypt/src/headers
LOCAL_CFLAGS += -DDROPBEAR_CLIENT

include $(BUILD_SHARED_LIBRARY)

include $(call all-makefiles-under,$(LOCAL_PATH))

试试这个:

CC="arm-linux-androideabi-gcc --sysroot=/path/to/android-ndk-r10d/platforms/android-9/arch-arm" ./configure --host=arm-linux-androideabi --disable-zlib

(如果 configure 也尝试 运行 C++ 编译,您还需要在命令行中的 ./configure 之前添加 CXX="arm-linux-androideabi-g++ --sysroot=/same/path"。)

或者,您可以构建一个完整的独立工具链,您无需手动指定 sysroot。您可以使用脚本 <ndk>/build/tools/make-standalone-toolchain.sh 构建此类工具链(请参阅 NDK 文档中的 "Standalone toolchain" 主题)。但是,如果您只打算将它用于 运行 配置,生成 config.h 以使用 Android.mk 构建其余部分,这可能有点矫枉过正。