Android NDK использует .so библиотеку из c-кода внутри JNI

Я нашел похожие вопросы по SO, но ни один из них не был с одним рабочим процессом.

У меня есть библиотека .so (libcurl) в моем проекте. Проект строится, но мне нужно получить curl.h в моем коде c внутри JNI.

Вот мой файл Android.mk:

LOCAL_PATH:= $(call my-dir) LIBS_PATH := libs/$(TARGET_ARCH_ABI) include $(CLEAR_VARS) LOCAL_MODULE := libcurl LOCAL_SRC_FILES := $(LIBS_PATH)/libcurl.so include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := testLib LOCAL_SRC_FILES := lib.c LOCAL_SHARED_LIBRARIES += libcurl include $(BUILD_SHARED_LIBRARY) 

Вот мой class c:

 #include "curl/curl.h" #include "lib.h" JNIEXPORT jint JNICALL Java_com_example_test_1libcurlandroidlib_Lib_getTestNumber (JNIEnv *env , jclass clazz) { return 99; } 

Проблема заключается в команде include / curl.h. Я также пробовал, но он не находит его:

 jni/lib.c:2:23: fatal error: curl/curl.h: No such file or directory #include "curl/curl.h" 

У меня есть файл libcurl.so внутри папки lib внутри папки JNI, которая во время сборки создает тот же (я думаю) файл в папку libs в корне приложения:

введите описание изображения здесь

Кто-нибудь знает, почему я не могу получить рецензию curl.h или что мне нужно сделать, чтобы завладеть этой библиотекой?

Спасибо!

jni / lib.c: 2: 23: фатальная ошибка: curl / curl.h: нет такого файла или каталога

include “curl / curl.h”

Чтобы использовать эту библиотеку, вам нужен не только скомпилированный .so-файл, но и набор прототипов функций (и, возможно, определений типов данных), обычно предоставляемых файлом заголовка.

С четко определенной установкой библиотеки они будут предоставляться по пути, соседствующему с двоичным, т. Е. У вас будет несколько «curlibrary / lib / libcurl.so», а рядом с ним будет «curlibrary / include / curl / curl.h» ”

Чтобы сделать эту работу, вы добавили бы путь к каталогу include curl в свою командную строку компилятора, предположительно, добавив его в ваш Android.mk

 LOCAL_C_INCLUDES := curlibrary/include 

Или там, где вы его держите.

Чтобы использовать путь включения, ваши ссылки на библиотеку в коде должны быть заключены в угловые скобки, а не в двойные кавычки, т.е.

 #include  //this searches the include path 

вместо

 #include "curl/curl.h" //while this specifies a location relative to this source file 

В более запутанном контексте вы можете не иметь четко определенной установки, а просто файл .so (надеюсь, совместимый с вашим Android ABI), который вы хотите использовать, и файл заголовка, который вы либо извлекли, либо даже воссоздан. В этом случае вы можете более беспорядочно бросить «curl.h» где-нибудь в исходном проекте и включить его по определенному кавычному пути, который вы пытались сделать. Если этот путь верен, он будет работать, но он разрушает чистую иерархию дизайна и может вызвать путаницу, если api завитка когда-либо изменится в будущем.