Ich habe ein kleines Problem mit libcurl in einigen nativen Routinen, die von einer Android App aufgerufen werden. Wenn ich versuche, eine get-Anfrage zu machen, sagt libcurl: "Hostname konnte nicht aufgelöst werden."Einschließlich libcurl in Android App mit nativen Funktionen
Ich befolge die Standardprozedur des Einbringens von C++ - Code in einen jni-Ordner mit einer Android.mk-Datei. In der Datei "Android.mk" habe ich den Befehl $ (BUILD_SHARED_LIBRARY) verwendet, um eine gemeinsam genutzte Bibliothek zu erstellen, die ich mit meiner Java Android App verwenden kann. Die Android-App wird gestartet, lädt die gemeinsam genutzte Bibliothek und ruft einige Funktionen auf, die zum Aufruf von libcurl-Funktionen führen.
Ich habe libcurl mit libcurl.a in meine shared library aufgenommen, zusammen mit libssl.a, libcrypto.a und libcares.a. Das Verfahren besteht darin, für jede in der Datei Android.mk eine Endung zu erstellen, die mit include $ (BUILD_SHARED_LIBRARY) endet.
Jede dieser statischen Bibliotheken wurde für Android mit dem Arm-androideabi-linux Cross-Compiler von ndk gebaut. Ich habe die letzte, libcares, in letzter Zeit hinzugefügt, um zu versuchen, den Fehler "Hostname konnte nicht aufzulösen" zu lösen, und habe curl mit libcares-Unterstützung neu aufgebaut.
Jetzt ist der komische Teil: um herauszufinden, was los ist, schrieb ich eine kleine main() {} Test-App und verknüpfte sie mit diesen gleichen statischen Bibliotheken über einen einzigen großen gcc-Befehl, und lief es weiter mein Telefon als native Arm ausführbar. Es funktioniert gut! Ich bin in der Lage, mein eigenes selbstsigniertes Zertifikat in libcurl zu laden und eine Anfrage über HTTPS an die Internetadresse meines Servers zu machen, und es funktioniert großartig. Ich habe auch den ganzen Prozess des Aufbaus von Dingen in der x86_64-Architektur durchlaufen und habe es dort auch funktionieren lassen.
Was ich nicht herausfinden kann ist, warum ich immer noch bekomme "Kann Host nicht auflösen" in meiner Android-App.
Locken Info:
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");
}
....
Logcat:
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
Sie sagen also, dass Sie eine funktionierende Curl-Implementierung für Android haben? Welche Version von Android? Ich habe keine gefunden, die mit PIE arbeiten. – Kristopher
Es ist Marshmallow und Curl-7.48.0. Ich habe gerade den Binär-Curl getestet, der beim Erstellen von Curl erstellt wurde, aber er erwartet Shared-Bibliotheken, die nicht auf meinem Telefon sind. Ich möchte nicht durch die Reifen springen, aber Sie könnten den letzten Schritt des Builds ändern und alles statisch verknüpfen. Es würde funktionieren, so wie es funktioniert, wenn ich libcurl statisch mit meiner Java/nativen App verknüpfe. (Wie du sagst, musste ich LDFLAGS = -fPIE -pie und --with-pic für neuere Android) hinzufügen. Update: sieht aus wie Cyanogenmod 13 kommt auch mit einer binären curl, die funktioniert (zumindest für die lg g3) – Colin