android curl.so使用(二)

前言
上一章 android curl库编译(一) 已经说明了curl.so NDK-build,既然编译好了,总要调用吧;
这章主要讲述在一个android 工程里实际调用. (环境 win7 64 as4.1.1)

1: 调用curl前提
android 调用so
1:需要相应的jni文件,可以把.h 自己翻译成jni 接口
2 :自己再次封装 ,提供几个接口 (这里讲述的采用这种方式,就是再创建个so 调用curl.so,在新的so里 封装自己的函数)

2: 创建调用工程
创建调用工程 (testcurl)
1: 先创建java 文件(JNIUtils.java),在 主文件 同级
在这里插入图片描述
JNIUtils.java 内容如下

package com.example.testcurl;

public class JNIUtils {
    //加载生成的so库文件
    //注意要跟.so库文件名相同
    static {
        System.loadLibrary("TestCallCurl");
    }

    //java调C中的方法都须要用native声明且方法名必须和c的方法名同样
    public native static String curlhttpget(String url);
}

点击Androidstudio build ->make project
在 cd 到 classes 目录 执行 javah com.example.testcurl.JNIUtils
会生成 com_example_testcurl_JNIUtils.h
android curl.so使用(二)_第1张图片
2:把生成的.h 文件及 各种架构的libcurl.so 及curl的头文件都拷贝到 jni 目录下

android curl.so使用(二)_第2张图片
1> com_example_testcurl_JNIUtils.cpp 内容如下

#include 
#include 
#include 
#include "curl/curl.h"
#include 
using namespace std ;
#include "com_example_testcurl_JNIUtils.h"

#include 



#define TAG "CURLLIB"
#define LOGI(FORMAT,...) __android_log_print(ANDROID_LOG_INFO, TAG, FORMAT, ##__VA_ARGS__);
#define LOGE(FORMAT,...) __android_log_print(ANDROID_LOG_ERROR, TAG, FORMAT, ##__VA_ARGS__);

size_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata)
{
    ((std::string*)userdata)->append(ptr, nmemb);
    return nmemb;
}

JNIEXPORT jstring JNICALL Java_com_example_testcurl_JNIUtils_curlhttpget
  (JNIEnv *env, jclass jc, jstring js){
    curl_global_init(CURL_GLOBAL_DEFAULT);
    CURL* curl = curl_easy_init();
    std::string response_data;
    if (curl)
    {
        jboolean  b = JNI_TRUE ;
        const char *nativeString = (const char *)env->GetStringUTFChars(js, &b);
        curl_easy_setopt(curl, CURLOPT_URL, nativeString);

        // no certificate, not verify server certificate
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);

        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response_data);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
        CURLcode res = curl_easy_perform(curl);
        if (res != CURLE_OK)
        {
            fprintf(stderr, "curl_easy_perform() failed: %s\n",
                curl_easy_strerror(res));
        }
        else
        {
            long response_code;
            curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code);
            printf("response code %d \n", response_code);
            printf("response data : \n ");
            printf("%s",response_data.c_str());
            LOGI("%ld-%s",response_code,response_data.c_str())
        }

        curl_easy_cleanup(curl);
    }

    curl_global_cleanup();
    return  env->NewStringUTF(response_data.c_str());
 }

2> Android.mk 内容如下

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := curl
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libcurl.so
include $(PREBUILT_SHARED_LIBRARY)


include $(CLEAR_VARS)

LOCAL_MODULE    := TestCallCurl

#LOCAL_C_INCLUDES := $(LOCAL_PATH)/include

LOCAL_SRC_FILES := \
    com_example_testcurl_JNIUtils.cpp

LOCAL_C_INCLUDES += $(LOCAL_PATH)/include
#LOCAL_LDLIBS :=  -llog
LOCAL_LDLIBS := -L$(TARGET_ARCH_ABI) -lcurl -llog

#LOCAL_SHARED_LIBRARIES := Test


include $(BUILD_SHARED_LIBRARY)

3> Application.mk 内容如下

APP_ABI := armeabi-v7a,arm64-v8a,x86,x86_64
APP_PLATFORM := android-23
APP_STL := stlport_static

4> ndk-build
参考上章 android curl库编译(一)
编译完如图
android curl.so使用(二)_第3张图片
3: 编译调用工程
1:app 下 build.gradle 文件
android curl.so使用(二)_第4张图片

随便写了个网址测试,OK
android curl.so使用(二)_第5张图片

4: 补充
时间仓促,非英文字符编码可能存在问题,本例只实现了http get,后续有时间再补充;

你可能感兴趣的:(android,android,android,studio,gradle,curl)