android curl.so使用(二)

本文档介绍了如何在Android工程中调用预先编译好的curl库进行HTTP GET请求。首先,需要创建jni接口并翻译.h文件为JNI函数,然后在cpp文件中实现curl操作。接着,配置Android.mk和Application.mk文件以编译JNI代码,并确保.so库和头文件在正确位置。最后,通过示例展示了如何在Java代码中加载库并调用curlhttpget方法进行网络请求。
摘要由CSDN通过智能技术生成

前言
上一章 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 <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include "curl/curl.h"
#include <string>
using namespace std ;
#include "com_example_testcurl_JNIUtils.h"

#include <android/log.h>



#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 文件
在这里插入图片描述

随便写了个网址测试,OK
在这里插入图片描述

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值