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

时间:2015-02-24 19:51:46

标签: android c curl android-ndk

我在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文件夹中:

enter image description here

有没有人知道为什么我无法参考curl.h,或者我必须做些什么才能获得这个库?

谢谢!

1 个答案:

答案 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发生变化,可能会引起混淆。