2016-04-08 13 views
1

Androidアプリから呼び出されるネイティブルーチンでlibcurlを使用することには微妙な問題があります。私がgetリクエストをしようとすると、libcurlは "ホスト名を解決できませんでした"と言います。ネイティブ関数付きのAndroidアプリにlibcurlを含める

Android.mkファイルを持つjniフォルダにいくつかのC++コードを入れる標準的な手順に従っています。 Android.mkでは$(BUILD_SHARED_LIBRARY)コマンドを使用してJava Android Appで使用できる共有ライブラリを作成しました。 Androidアプリが起動し、共有ライブラリを読み込み、libcurl関数を呼び出すいくつかの関数を呼び出します。

共有ライブラリにlibcurl.aを含め、libssl.a、libcrypto.a、libcares.aと一緒にlibcurlを含めました。手順は、Android.mk内のそれぞれのためにinclude $(BUILD_SHARED_LIBRARY)で終わるスタンザを作成することです。

それぞれの静的ライブラリは、ndkのarm-androideabi-linuxクロスコンパイラを使用してアンドロイド用に作成されています。最後にlibcaresを追加しました。最近では、「ホスト名を解決できませんでした」というエラーを解決し、libcaresサポートでcurlを再構築しようとしています。

何が起きているのか理解しようとすると、小さなmain(){テストアプリを作成し、同じ静的ライブラリと1つの大きなgccコマンドでリンクして実行しました私の電話はネイティブの腕の実行可能ファイルとして。それはうまく動作します!私は自分の自己署名入りの証明書をlibcurlにロードして、https経由で私のサーバのインターネットURLにリクエストを行い、うまく動作します。 私はx86_64アーキテクチャのものを構築するという全プロセスを経て、そこでも作業しました。

私が知ることができないのは、なぜ私がアンドロイドアプリで「解決できないホスト」になっているのかということです。

カール情報:

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 

答えて

0

はまったくカールの問題ではありません。私は古いバージョンのアプリからAndroidのアクセス許可を転送していませんでした。しかし、私は途中でやっていただろうカールのビルドの問題(sslとリゾルバーのサポート)の束を解決することになった。

これはSOに任せておくのが便利なのかどうかわかりません。

+0

あなたは、Android用のカールを実装していると言っていますか? Androidのどのバージョンですか?私はPIEでその仕事を見つけませんでした。 – Kristopher

+1

マシュマロとカール7.48.0です。私はカールを構築したときにビルドされたバイナリカールをテストしましたが、私の電話にない共有ライブラリが必要です。フープを飛び越えたくはありませんが、ビルドの最後のステップを変更して静的にすべてをリンクすることができます。それは私のjava/native appと静的にlibcurlをリンクするときと同じように動作します。 (あなたが言うように、私はLDFLAGS = -fPIE -pieと--with-picを新しいAndroidに追加しなければならなかった)。アップデート:Cyanogenmod 13にはバイナリカールが付属しています(少なくともlg g3では動作します) – Colin

関連する問題