Android ndk 在Android应用程序中包含libcurl和本机函数
我在一些从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应用程序中仍然出现“无法解析主机” 卷曲信息: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
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)