我在SO上发现了类似的问题,但没有一个问题与工作流程相同。
我的项目中有一个.so库(libcurl)。该项目构建但我需要在JNI中的c代码中获取curl.h。
这是我的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)
这是我的c班:
#include "curl/curl.h"
#include "lib.h"
JNIEXPORT jint JNICALL Java_com_example_test_1libcurlandroidlib_Lib_getTestNumber
(JNIEnv *env , jclass clazz)
{
return 99;
}
问题在于“curl / curl.h”include命令。我也试过,但它也找不到:
jni/lib.c:2:23: fatal error: curl/curl.h: No such file or directory
#include "curl/curl.h"
我的libcurl.so文件位于JNI文件夹内的lib文件夹中,该文件夹在构建时生成相同的(我认为)文件到应用程序根目录的libs文件夹中:
有没有人知道为什么我无法参考curl.h,或者我必须做些什么才能获得这个库?
谢谢!
答案 0 :(得分:0)
jni / lib.c:2:23:致命错误:curl / curl.h:没有这样的文件或目录
包括" curl / curl.h"
要使用此库,您不仅需要编译的.so文件,还需要通常由头文件提供的一组函数原型(可能还有数据类型定义)。
使用明确定义的库安装,这些将在与二进制文件相邻的路径中提供 - 即,您将拥有一些" curlibrary / lib / libcurl.so"并且旁边有一个" curlibrary / include / curl / curl.h"
为了实现这一目的,你可以将curl的include目录路径添加到编译器命令行,大概是将它添加到你的Android.mk
LOCAL_C_INCLUDES := curlibrary/include
或者无论你在哪里保留它。
要使用include路径,您在代码中对库的引用需要用尖括号括起来,而不是双引号,即
#include <curl/curl.h> //this searches the include path
而不是
#include "curl/curl.h" //while this specifies a location relative to this source file
在更多的夜间环境中,您可能没有一个明确定义的安装,只是一个.so文件(希望与您的Android ABI兼容),您想要使用,以及您已提取甚至重新创建的头文件。在这种情况下,你可能会更随意地折腾&#34; curl.h&#34;在项目源中的某个位置,并按照您尝试的方式通过特定的引用路径包含它。如果路径是正确的,它将起作用 - 但它打破了设计的干净层次结构,如果将来卷曲的api发生变化,可能会引起混淆。