如何将http C库正确包含到Android项目中?

时间:2019-04-25 10:00:00

标签: c java-native-interface http-post

我正在制作一个Android项目,并且正在尝试使用HTTPS向服务器发出发布请求。要发出发布请求,我需要使用JNI,因此需要在C中实现。
我的想法是使用一个与minizip library here相同的,可以包含在项目中的库。

我发现这个库here在我看来似乎足够强大,可以满足我的目的。我包含在文件夹c中,您也可以在文件ca_cert.hhttps.chttps.h的下方看到文件夹mbedtls,与文件夹├── 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 完全相同。 github项目。

CMakeLists.txt

您可以在上面的树结构中看到,我的根目录中有一个src/main/c/,在CMakeLists.txt中,您会看到我从上述https库中获取的文件和文件夹。

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 starts\n");
            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)

我知道

{{1}}

1 个答案:

答案 0 :(得分:1)

替换

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

使用

            src/main/c/https.c

CMakeLists.txt中。