在android NDK中包含本地头文件时的未定义引用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在android NDK中包含本地头文件时的未定义引用相关的知识,希望对你有一定的参考价值。

我构建了一个简单的android应用程序,它使用ndk和JNI。该应用程序具有onw .cpp(debugTest.cpp)文件,该文件用于将java和c ++与jni和另一个.c(javaEssentials.c)文件与其标头(javaEssentials.h)链接。当我在.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文件的目录

以上是关于在android NDK中包含本地头文件时的未定义引用的主要内容,如果未能解决你的问题,请参考以下文章

在使用 C++ 和 Java 的 Android 应用程序中包含 TFLite C API 时的构建问题

使用头文件编译 C++ 程序时出错:体系结构 x86_64 的未定义符号

在 Qt 应用程序中包含 Python.h 会导致对 Qt 函数的未定义引用

在android ndk中使用ubuntu header lib

如何在android studio项目中包含共享库?

对函数 Android NDK 的未定义引用