前言
上一章 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
2:把生成的.h 文件及 各种架构的libcurl.so 及curl的头文件都拷贝到 jni 目录下
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库编译(一)
编译完如图
3: 编译调用工程
1:app 下 build.gradle 文件
4: 补充
时间仓促,非英文字符编码可能存在问题,本例只实现了http get,后续有时间再补充;