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”包含命令中.我也尝试过,但也没有找到它:

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: Fatal error: curl/curl.h: No such file or directory

include “curl/curl.h”

要使用此库,您不仅需要已编译的.so文件,还需要通常由头文件提供的一组函数原型(也许还有数据类型定义).

使用定义明确的库安装,将在二进制文件附近的路径中提供这些文件-即,您将拥有一些“ curlibrary / lib / libcurl.so”,并在其旁边有一个“ curlibrary / include / curl / curl.h” “

为此,您可以将curl的include目录的路径添加到编译器命令行中,大概是通过将其添加到Android.mk中来进行.

LOCAL_C_INCLUDES := curlibrary/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兼容)以及已提取提取的头文件.甚至重新创建.在这种情况下,您可能会更随意地将“ curl.h”扔到项目源代码中的某个位置,并在尝试执行操作时通过特定的引用路径将其包括在内.只要路径正确,它就会起作用-但会破坏设计的简洁层次,并且如果将来的curl api发生更改,可能会造成混乱.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...