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