簡體   English   中英

android NDK中包含本地頭文件時的未定義引用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM