2016-04-08 3 views
1

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 

Antwort

0

kein Lockenproblem. Ich hatte die Android-Berechtigungen nicht von einer älteren Version der App übertragen. Wie auch immer, am Ende eine Reihe von Curl Build-Probleme (mit SSL-und Resolver-Unterstützung) zu lösen, hätte ich sowieso auf dem Weg gehabt.

Ich weiß nicht, ob das eine nützliche Frage ist, auf SO oder nicht zu verlassen.

+0

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

+1

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

Verwandte Themen