繁体   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