如何将 http C 库正确地包含在 Android 项目中



我正在制作一个Android项目,我正在尝试使用HTTPS向服务器发出post请求。要发出发布请求,我需要使用 JNI,所以我需要在 C 中实现这一点。
我的想法是使用一个库,我可以将其包含在我的项目中,就像我在这里对minizip库所做的那样。

我在这里找到了这个图书馆,在我看来,它很

轻松,可以满足我的目的。我包含在文件夹中c,因为您还可以在下面看到文件ca_cert.hhttps.chttps.h以及文件夹mbedtls与github项目完全相同。

├── app.iml
├── build.gradle
├── CMakeLists.txt
└── src
    ├── androidTest
    │   └── java
    │       └── etc
    ├── main
    │   ├── AndroidManifest.xml
    │   ├── c
    │   │   ├── ca_cert.h
    │   │   ├── https.c
    │   │   ├── https.h
    │   │   ├── mbedtls
    │   │   │   ├── etc
    │   │   ├── native-lib.c
    │   │   ├── pathfinder.c
    │   │   ├── pathfinder.h
    │   │   ├── post_data.c
    │   │   ├── post_data.h
    │   │   ├── third
    │   ├── java
    │   │   └── etc
    │   └── res
    │       ├── etc
    └── test
        └── java
            └── etc

正如您在上面的树结构中看到的那样,我在根目录中有一个CMakeLists.txtsrc/main/c/您将看到我从提到的https库中获取的文件和文件夹。

CMakeLists.txt的内容如下

cmake_minimum_required(VERSION 3.4.1)
add_library(    # Sets the name of the library.
                native-lib
                # Sets the library as a shared library.
                SHARED
                # Provides a relative path to your source file(s).
                src/main/c/native-lib.c
                src/main/c/ca_cert.h
                src/main/c/https.h
                )
include_directories(native-lib SHARED src/main/c/mbedtls/include)
#add_definitions(-DHAVE_ZLIB)
find_library( PRE_BUILD_ANDROID_LIB android)
find_library( log-lib log)
find_library(z-lib z)

target_link_libraries( native-lib
                       ${PRE_BUILD_ANDROID_LIB}
                       ${log-lib}
                       ${z-lib}
                       )

我错过了一些东西,但当我尝试运行如下所示的简单示例时,肯定会有所

作为
JNIEXPORT jint JNICALL
Java_example_example_do_post(
        JNIEnv *env,
        jobject  this ) {
        NSV_LOGE("post_data startsn");
            char *url;
            char data[1024], response[4096];
            int  i, ret, size;
            HTTP_INFO hi1, hi2;

            // Init http session. verify: check the server CA cert.
            http_init(&hi1, FALSE);
            http_init(&hi2, TRUE);
        url = "http://httpbin.org/get?message=https_client";
        ret = http_get(&hi1, url, response, sizeof(response));
        return 0;
}

我得到

../../../../src/main/c/native-lib.c:56: error: undefined reference to 'http_init'
../../../../src/main/c/native-lib.c:57: error: undefined reference to 'http_init'
../../../../src/main/c/native-lib.c:61: error: undefined reference to 'http_get'
clang: error: linker command failed with exit code 1 (use -v to see invocation)

替换

            src/main/c/ca_cert.h
            src/main/c/https.h

            src/main/c/https.c

CMakeLists.txt.

最新更新