![](/img/trans.png)
[英]Android NDK / JNI - undefined reference to function defined in custom header file
[英]undefined reference when including a local header file in android NDK
我構建了一個使用ndk和JNI的簡單android應用程序。 該應用程序具有onw .cpp(debugTest.cpp)文件,該文件用於將Java和c ++與jni鏈接,另一個具有其標頭(javaEssentials.h)的.c(javaEssentials.c)文件。 當我在.cpp文件中包含.c文件(#include“ javaEssentials.c”)時,編譯時未報告任何錯誤。 當我在.cpp文件中包含標頭時,編譯器會報告.c文件具有的函數的未定義引用錯誤。這確實是一個奇怪的問題,我不明白為什么會這樣。 和往常一樣,我在.c文件中包含頭文件的包含聲明。
我的android.mk是:
# build file written to describe the C and C++ source files to the Android NDK
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := debugTest
LOCAL_SRC_FILES := debugTest.cpp
include $(BUILD_SHARED_LIBRARY)
任何想法為什么會這樣?
您應該只包含標頭(或使用原型)以允許C文件進行編譯。
編譯后,您仍然會抱怨“未定義對`methodName'的引用”錯誤。
這是因為C ++編譯器在cpp文件中編碼方法的名稱空間。 它不會對c文件中的方法(或重要的是對於方法調用)執行此操作。 這意味着即使源代碼會建議這樣做,已編譯的c文件也無法自然地訪問已編譯的c ++代碼中的方法。
但是,您可以告訴編譯器該方法將由“ C”語言調用,因此不會對方法名稱空間進行編碼。 您可以通過修改cpp中的方法來指示編譯器執行以下操作:
extern "C" int methodName()
{
return 1;
}
現在可以從編譯的C文件訪問methodName()。
您應該#include .h文件,而不是.c或.cpp。
添加到您的Android.mk
文件:
LOCAL_C_INCLUDES := $(LOCAL_PATH)include_dir1 \
$(LOCAL_PATH)include_dir2 \
...
對於每個包含.h
文件的目錄
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.