2015-02-24 71 views
2

我在SO上發現了類似的問題,但沒有一個使用相同的工作流程。Android NDK使用JNI中c代碼的.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.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文件夾:

enter image description here

有沒有人有,爲什麼我不能夠獲得referece到curl.h任何想法,或者我有什麼做的就是這個庫的舉行?

謝謝!

+0

你是認真的嗎?這是你自己的問題的重複:http://stackoverflow.com/questions/28633243/how-to-import-the-curl-built-library-into-android-ndk。我已經嘗試過幫助你。 – 2015-02-24 20:02:33

+0

我投票結束這個問題作爲題外話,因爲這個問題已經被同一用戶在這裏問:http://stackoverflow.com/questions/28633243/how-to-import-the-curl-built-library -INTO-Android的NDK。此外,我嘗試與用戶一步一步走過。 – 2015-02-24 20:03:51

+0

@JaredBurrows - 你管理的另一個問題在相當切線的時候不注意用戶的要求。 **這是一個更具體的關於他們在做什麼,並給出了一個錯誤信息,可以提供具體的援助。** – 2015-02-25 12:47:03

回答

0

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 /包括/curl/curl.h」

爲了使這項工作,你將包括目錄添加捲曲的的路徑,你的編譯器的命令行,大概是通過將它添加到你的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」,並在您嘗試執行時通過特定的引用路徑將其引入。如果路徑是正確的,那麼它就會起作用 - 但它打破了設計的清晰層次,並且如果捲曲的api將來會改變,可能會引起混淆。

+0

謝謝克里斯。一個問題:包含「LOCAL_C_INCLUDES:= curlibrary/include」應該包含在生成.so文件的庫的Android.mk中,還是應該放在試圖使用.so文件的項目中? – TooManyEduardos 2015-02-25 15:28:54

+0

包含路徑指定在哪裏找到您需要的內容,因此它屬於用戶。如果您正在構建庫,它可能需要相同或相似的頭文件,但您必須查看特定構建系統的設置,以瞭解應該如何找到它們。 – 2015-02-25 15:50:12

+0

謝謝克里斯,我會這樣追逐 – TooManyEduardos 2015-02-25 16:10:20

相關問題