рдХреНрдпреЛрдВ рдЬрд░реВрд░реА рд╣реИ?
рд╣рдо C ++ рдореЗрдВ рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рддрд╣рдд рд╣рдорд╛рд░реЗ рд╕рднреА рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рд▓рд┐рдЦрд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдмреЗрд╢рдХ рд╣рдо android рдХреЗ рддрд╣рдд рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
Libcurl рдПрдХ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдПрдкреАрдЖрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬрд┐рд╕реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ;
curl libcurl рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди рдЖрд╡рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред libcurl рдХрд╛ рдЙрдкрдпреЛрдЧ рдлрд╝рд╛рдЗрд▓реЛрдВ (URL рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрддрд╛ рдХрд░рдиреЗ рдпреЛрдЧреНрдп) рдХреЛ рдХрдИ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ (рдЦреБрд▓реЗ рдФрд░ рд╡рд╛рдгрд┐рдЬреНрдпрд┐рдХ рджреЛрдиреЛрдВ) рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред (
рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ )
IOS рдХреЗ рд▓рд┐рдП, рдЖрдк рдбреЗрд╡рд▓рдкрд░ рдХреА рд╕рд╛рдЗрдЯ рд╕реЗ
cURL рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЙрджрд╛рд╣рд░рдг рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ iOS рдХреЗ рд╕рд╛рде рдпрд╣ рд╕рд░рд▓ рд╣реИред
рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рддрд╣рдд, Google рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдкрд░, рдореБрдЭреЗ рдПрдХ рднреА рд╕реНрд░реЛрдд рдирд╣реАрдВ рдорд┐рд▓рд╛ рдЬрд╣рд╛рдВ рдЗрд╕ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рд╕рдлрд▓ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред (рд╢рд╛рдпрдж рдореИрдВ рдмреБрд░реА рддрд░рд╣ рд╕реЗ рджреЗрдЦ рд░рд╣рд╛ рдерд╛)ред
рдФрд░ рдЖрдо рддреМрд░ рдкрд░ рдмреЛрд▓рдирд╛,
cURL рдХреЗ рд╕рд╛рде рдПрдВрдбреНрд░реЙрдЗрдб рдХрд╛ рдХрд╛рдо рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рддрдирд╛ рд╣рдо рдЪрд╛рд╣реЗрдВрдЧреЗред
рд╣рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП:
- Android рдЧреНрд░рд╣рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдкрд┐рдд рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛;
- ndk рдФрд░ рдЙрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛;
- Android рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреБрд╕реНрддрдХрд╛рд▓рдпред
Android рдХреЗ рд▓рд┐рдП CURL рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
рдпрджрд┐ рдЖрдк
cURL рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдбрд╛рдЙрдирд▓реЛрдб рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдПрдХ рд╕рдВрдХрд▓рд┐рдд рдмрд╛рдЗрдирд░реА (рдПрдВрдбреНрд░реЙрдЗрдб 7.31.0 рдмрд╛рдЗрдирд░реА рдПрд╕рдПрд╕рдПрд▓) рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЬрд╛рд╣рд┐рд░ рддреМрд░ рдкрд░ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рдиреАрдЪреЗ рд╕реЗ рдХрдВрд╕реЛрд▓ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмреЗрдХрд╛рд░ рд╣реИ рдЕрдЧрд░ рд╣рдо рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рд╕реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдЕрдЪреНрдЫрд╛ рдЧреВрдЧрд▓, рдЖрдк ndk * .a рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ
рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
Android рдФрд░ рдПрдХ
рд╣рдм рдХреЗ рд▓рд┐рдП рдкреЛрд░реНрдЯрд┐рдВрдЧ
cURL рд╣реИ рдирддреАрдЬрддрди, рд╣рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд * .a рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдлрд╝рд╛рдЗрд▓ рдорд┐рд▓рддреА рд╣реИред рдореИрдВрдиреЗ рдЦреБрдж рдЗрд╕реЗ рдПрдХрддреНрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдореИрдВрдиреЗ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдЗрд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ред
рдЖрдЧреЗ
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдкреБрд╕реНрддрдХрд╛рд▓рдп, рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдПрдореНрдмреЗрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
ndk рдХреА рд╕рднреА рд╢рдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЬрд╛рд╡рд╛ рднрд╛рдЧ рднрд╛рдЧ
рдЙрд╕ рд╕рд╛рдЗрдЯ рдХрд╛ рдкрддрд╛ рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдЯрди рдФрд░ рдПрдХ рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде MainActivity рдмрдирд╛рдПрдВ, рдЬрд╣рд╛рдВ рд╕реЗ рд╣рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧреАред
activity_main.xml :
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <EditText android:id="@+id/server_url" android:text="@string/default_url" android:hint="@string/server_url_hint" android:layout_width="match_parent" android:layout_height="wrap_content" android:singleLine="true"/> <Button android:id="@+id/button_curl_call" android:layout_below="@+id/server_url" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:text="@string/button_curl" android:layout_gravity="right" /> <TextView android:id="@+id/text" android:layout_below="@+id/button_curl_call" android:layout_weight="1" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </RelativeLayout>
MainActivity.java package com.ifree.ndkNative; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.app.Activity; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends Activity { private static final String INTENT_HTML_DATA = ".html_data"; public static final int HANDLE_CALLBACK = 0; final private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case HANDLE_CALLBACK: String html = msg.getData().getString(INTENT_HTML_DATA); SetHtmlText(html); break; } } }; private void SetHtmlText(String html){ TextView tv = (TextView) findViewById(R.id.text); tv.setText(html); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final EditText serverUrl = (EditText) findViewById(R.id.server_url); Button btnCurl = (Button) findViewById(R.id.button_curl_call); btnCurl.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Native curl = new Native(); curl.addCurlCallbackListener(new ICurlCallbackListener() { @Override public void curlCallBack(String callback) {
рд╣рдо
Native.java рдХреНрд▓рд╛рд╕
рд▓рд┐рдЦреЗрдВрдЧреЗ , рдЬрд┐рд╕рдореЗрдВ C ++ рдХреЛрдб рдкрд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
package com.ifree.ndkNative; import java.util.HashSet; public class Native { private HashSet<ICurlCallbackListener> callBackListeners = new HashSet<ICurlCallbackListener>(); public void addCurlCallbackListener(ICurlCallbackListener listener){ callBackListeners.add(listener); } public void removeCurlCallbackListener(ICurlCallbackListener listener){ callBackListeners.remove(listener); } static { System.loadLibrary("ndkNative"); }
AndroidManifest рдореЗрдВ рдЗрдВрдЯрд░рдиреЗрдЯ рдХреА рдЕрдиреБрдорддрд┐ рдЬреЛрдбрд╝рдирд╛ рди рднреВрд▓реЗрдВ
<uses-permission android:name="android.permission.INTERNET"/>
C ++ рднрд╛рдЧ
рдЬрд╛рд╡рд╛ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЧрдпрд╛
com_ifree_ndkNative_Native.h /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_ifree_ndkNative_Native */ #ifndef _Included_com_ifree_ndkNative_Native #define _Included_com_ifree_ndkNative_Native #ifdef __cplusplus extern "C" { #endif /* * Class: com_ifree_ndkNative_Native * Method: get_text_from_cpp * Signature: (Ljava/lang/String;)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_ifree_ndkNative_Native_get_1text_1from_1cpp (JNIEnv *, jobject, jstring); #ifdef __cplusplus } #endif #endif
NdkNative.cpp рдореЗрдВ рд╕рд░реНрд╡рд░ рд╕реЗ рдбрд╛рдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ (JNICALL Java_com_ifree_ndkNative_Native_get_1text_1from_1cpp)
#include <string.h> #include <stdio.h> #include "stddef.h" #include <jni.h> #include "com_ifree_ndkNative_Native.h" #include "curl/curl.h" #include "curl/easy.h" JNIEnv * gEnv; jobject gObj; void function_callback(jstring str){ jclass cls = gEnv->GetObjectClass(gObj); jmethodID mid = gEnv->GetMethodID(cls, "callback", "(Ljava/lang/String;)V");// java Native.callback(String data) gEnv->CallVoidMethod(gObj, mid, str); } size_t function_pt(void *ptr, size_t size, size_t nmemb, void *stream){ function_callback(gEnv->NewStringUTF((char *) ptr)); size_t written = fwrite(ptr, size, nmemb, (FILE*)stream); if(written <= 0) return written * size; } JNIEXPORT jstring JNICALL Java_com_ifree_ndkNative_Native_get_1text_1from_1cpp (JNIEnv * env, jobject obj, jstring str) { gEnv = env; gObj = obj; CURL *curl; CURLcode res; curl = curl_easy_init(); if(curl) { curl_easy_setopt(curl, CURLOPT_URL, env->GetStringUTFChars(str, 0)); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, function_pt); res = curl_easy_perform(curl); curl_easy_cleanup(curl); /* Check for errors */ if(res != CURLE_OK) function_callback(gEnv->NewStringUTF(curl_easy_strerror(res))); }else{ function_callback(gEnv->NewStringUTF("error")); } return env->NewStringUTF( "ok" ); }
Android.mf LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) include $(CLEAR_VARS) LOCAL_MODULE:= libcurl LOCAL_SRC_FILES := libcurl.a include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := ndkNative LOCAL_SRC_FILES := ndkNative.cpp LOCAL_STATIC_LIBRARIES := libcurl include $(BUILD_SHARED_LIBRARY)
рд╕реНрд░реЛрдд рдХреЛрдб
Ps: рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рджреГрдврд╝рддрд╛ рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ,
cURL рдХреЗ рд╕рд╛рде рд╕рднреА рдХрд╛рдореЛрдВ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╕реА ++ рд░реИрдкрд░ рдХреНрд▓рд╛рд╕ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
Pss: рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХреЛрдб рд╕рдореНрдореЗрд▓рди рдереЛрдбрд╝рд╛ рд▓рдВрдЧрдбрд╝рд╛ рд╣реИред