【问题标题】:undefined reference when including a local header file in android NDK在 android NDK 中包含本地头文件时未定义的引用
【发布时间】:2011-04-12 17:40:22
【问题描述】:

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

任何想法为什么会发生这种情况?

【问题讨论】:

    标签: android header include java-native-interface android-ndk


    【解决方案1】:

    您应该只包含头文件(或使用原型)以允许您的 C 文件编译。

    编译后你仍然会报错“undefined reference to `methodName'”。

    这是因为 C++ 编译器在 cpp 文件中编码方法的命名空间。它不会为 c 文件中的方法(或者重要的是,方法调用)执行此操作。这意味着编译的 c 文件不能自然地访问编译的 c++ 代码中的方法,即使源代码会建议这样做。

    但是,您可以告诉编译器该方法将由“C”语言调用,因此它不会对方法命名空间进行编码。您可以通过将 cpp 中的方法修改为如下所示来指示编译器执行此操作:

    extern "C" int methodName()
    {
        return 1;
    }
    

    methodName() 现在可以从您编译的 C 文件中访问。

    【讨论】:

      【解决方案2】:

      您应该#include .h 文件,而不是 .c 或 .cpp。

      【讨论】:

        【解决方案3】:

        添加到您的Android.mk 文件:

        LOCAL_C_INCLUDES := $(LOCAL_PATH)include_dir1 \
                            $(LOCAL_PATH)include_dir2 \
                            ...
        

        对于每个有.h 文件的目录

        【讨论】:

        • 再次无法正常工作...我应该在 LOCAL_SRC_FILES 中包含所有文件还是仅包含使用 JNI 接口的文件?
        猜你喜欢
        • 2015-05-05
        • 1970-01-01
        • 2014-04-05
        • 2011-06-05
        • 2011-05-26
        • 1970-01-01
        • 2012-07-18
        • 2015-06-08
        • 2013-10-11
        相关资源
        最近更新 更多