Android ndk 在Android应用程序中包含libcurl和本机函数

Android ndk 在Android应用程序中包含libcurl和本机函数,android-ndk,libcurl,android-permissions,Android Ndk,Libcurl,Android Permissions,我在一些从Android应用程序调用的本机例程中使用libcurl时遇到了一个微妙的问题。当我尝试执行get请求时,libcurl说“无法解析主机名” 我遵循了一个标准程序,将一些C++代码放入一个JNI文件夹中,并带有一个ANDROID.MK文件。在Android.mk中,我使用$(BUILD_SHARED_LIBRARY)命令创建了一个可用于Java Android应用程序的共享库。Android应用程序启动、加载共享库并调用一些函数,最后调用libcurl函数 我通过在共享库中包含libc

我在一些从Android应用程序调用的本机例程中使用libcurl时遇到了一个微妙的问题。当我尝试执行get请求时,libcurl说“无法解析主机名”

<>我遵循了一个标准程序,将一些C++代码放入一个JNI文件夹中,并带有一个ANDROID.MK文件。在Android.mk中,我使用$(BUILD_SHARED_LIBRARY)命令创建了一个可用于Java Android应用程序的共享库。Android应用程序启动、加载共享库并调用一些函数,最后调用libcurl函数

我通过在共享库中包含libcurl.a以及libssl.a、libcrypto.a和libcares.a来包含libcurl。该过程是为Android.mk中的每个文件创建一节,以include$(BUILD_SHARED_LIBRARY)结尾

每个静态库都是使用ndk的arm AndroidABI linux交叉编译器为android构建的。我最近添加了最后一个libcares,试图解决“无法解析主机名”错误,并使用libcares支持重建了curl

现在有一个奇怪的部分:为了弄清楚到底发生了什么,我编写了一个小的main(){}测试应用程序,并通过一个大的gcc命令将它与这些相同的静态库链接起来,然后在手机上作为本机arm可执行文件运行。很好用!我能够将自己的自签名证书加载到libcurl中,并通过https向服务器的internet url发出get请求,这非常有效。 我还经历了在x86_64体系结构中构建东西的整个过程,并使它在那里工作

我不明白的是,为什么我的android应用程序中仍然出现“无法解析主机”

卷曲信息:

curl version:     7.48.0
Host setup:       arm-unknown-linux-androideabi
Install prefix:   /home/cworth/src/libcurl-android_built-w-23/local
Compiler:         arm-linux-androideabi-gcc
SSL support:      enabled (OpenSSL)
SSH support:      no      (--with-libssh2)
zlib support:     enabled
GSS-API support:  no      (--with-gssapi)
TLS-SRP support:  enabled
resolver:         c-ares
IPv6 support:     enabled
Unix sockets support: enabled
IDN support:      no      (--with-{libidn,winidn})
Build libcurl:    Shared=no, Static=yes
Built-in manual:  enabled
--libcurl option: enabled (--disable-libcurl-option)
Verbose errors:   enabled (--disable-verbose)
SSPI support:     no      (--enable-sspi)
ca cert bundle:   no
ca cert path:     no
ca fallback:      no
LDAP support:     no      (--enable-ldap / --with-ldap-lib / --with-lber-lib)
LDAPS support:    no      (--enable-ldaps)
RTSP support:     enabled
RTMP support:     no      (--with-librtmp)
metalink support: no      (--with-libmetalink)
PSL support:      no      (libpsl not found)
HTTP2 support:    disabled (--with-nghttp2)
Protocols:        DICT FILE FTP FTPS GOPHER HTTP HTTPS IMAP IMAPS POP3 POP3S RTSP SMB SMBS SMTP SMTPS TELNET TFTP

SONAME bump:     yes - WARNING: this library will be built with the SONAME
                 number bumped due to (a detected) ABI breakage.
                 See lib/README.curl_off_t for details on this.
Android.mk

CURLINC = ../../libcurl-android_built-w-23/local/include
CURLLIB = ../../libcurl-android_built-w-23/local/lib
LOCAL_PATH := .

include $(CLEAR_VARS)
LOCAL_MODULE = crypto
LOCAL_EXPORT_C_INCLUDES := $(CURLINC)
LOCAL_SRC_FILES := $(CURLLIB)/libcrypto.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE = ssl
LOCAL_EXPORT_C_INCLUDES := $(CURLINC)
LOCAL_SRC_FILES := $(CURLLIB)/libssl.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE = cares
LOCAL_EXPORT_C_INCLUDES := $(CURLINC)
LOCAL_SRC_FILES := $(CURLLIB)/libcares.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE = curl
LOCAL_EXPORT_C_INCLUDES := $(CURLINC)
LOCAL_SRC_FILES := $(CURLLIB)/libcurl.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := mynativelibrary
LOCAL_CFLAGS    := -D_FILE_OFFSET_BITS=64 -pthread -Ijni
LOCAL_CPPFLAGS := -std=c++11
LOCAL_CPP_FEATURES += exceptions rtti
LOCAL_SRC_FILES += {my source files.cpp}
LOCAL_STATIC_LIBRARIES :=  curl cares ssl crypto
LOCAL_LDLIBS := -lz -landroid -llog
include $(BUILD_SHARED_LIBRARY)
MainActivity.java

public class MainActivity extends AppCompatActivity {

    public native String talkToServer();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if(!runOnce) {
            runOnce = true;
            Thread.currentThread().setName("Main");
            System.loadLibrary("mynativelibrary");
        }            
....
日志:

04-08 02:33:17.023 28328-28506/com.domain.me D/notes: 2016-04-08'T'02:33:17'Z': GET https://example.com:22222/api/notes.json
04-08 02:33:17.023 28328-28506/com.domain.me D/notes: 2016-04-08'T'02:33:17'Z': GET result: Couldn't resolve host name

根本不是卷曲的问题。我没有从旧版本的应用程序中转移Android权限。然而,最终解决了一系列curl构建问题(使用ssl和解析器支持),这是我一直以来都会遇到的问题


我不知道这是否是一个有用的问题,可以这样继续下去。

根本不是卷曲问题。我没有从旧版本的应用程序中转移Android权限。然而,最终解决了一系列curl构建问题(使用ssl和解析器支持),这是我一直以来都会遇到的问题


我不知道这是否是一个有用的问题,可以就此搁置。

你是说你有一个适用于Android的curl实现?安卓的哪个版本?我还没找到能和派搭配的,是棉花糖和卷曲-7.48.0。刚刚测试了我在构建curl时构建的二进制curl,但它需要手机上没有的共享lib。不想跳转,但您可以更改构建的最后一步并静态链接所有内容。它可以工作,就像我将libcurl静态链接到我的java/本机应用程序时一样。(正如您所说,我必须添加LDFLAGS=-fPIE-pie和——对于较新的安卓系统,使用pic)。更新:看起来Cyanogenmod 13还附带了一个二进制curl(至少对于lg g3是这样),所以你是说你有一个适用于Android的curl实现?安卓的哪个版本?我还没找到能和派搭配的,是棉花糖和卷曲-7.48.0。刚刚测试了我在构建curl时构建的二进制curl,但它需要手机上没有的共享lib。不想跳转,但您可以更改构建的最后一步并静态链接所有内容。它可以工作,就像我将libcurl静态链接到我的java/本机应用程序时一样。(正如您所说,我必须添加LDFLAGS=-fPIE-pie和——对于较新的安卓系统,使用pic)。更新:看起来Cyanogenmod 13还带有一个双星卷曲,可以工作(至少对于lg g3)