Android NDK使用来自JNI内部c代码的.so库

我在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,或者我必须做些什么才能获得这个库?

谢谢!

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  //this searches the include path 

代替

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

在一个更复杂的环境中你可能没有一个定义明确的安装,只是你想要使用的.so文件(希望与你的Android ABI兼容),以及你提取的头文件或者甚至重新创造。 在这种情况下,您可能会更加随意地在项目源中的某个位置投掷“curl.h”,并在您尝试执行时通过特定的引用路径包含它。 如果路径是正确的,它将起作用 – 但它打破了干净的设计层次结构,并且如果将来curl的api发生变化,可能会引起混淆。