неопределенная ссылка при включении локального заголовочного файла в Android NDK - PullRequest
1 голос
/ 12 апреля 2011

Я создаю простое приложение для 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)

Есть идеи, почему это происходит?

Ответы [ 3 ]

5 голосов
/ 11 мая 2011

Вы должны включать только заголовки (или альтернативно использовать прототипы), чтобы позволить вашим C-файлам компилироваться.

После компиляции у вас все равно будет ошибка с "неопределенной ссылкой на" methodName ".

Это потому, что компиляторы C ++ кодируют пространство имен методов внутри файла cpp.Он не делает этого для методов (или, что важно, для вызовов методов) внутри файлов c.Это означает, что скомпилированные файлы c не могут естественным образом обращаться к методам в скомпилированном коде c ++, даже если исходный код предполагает именно это.

Однако вы можете сказать компилятору, что метод будет вызываться "C"Таким образом, язык не будет кодировать пространство имен метода.Вы можете указать компилятору сделать это, изменив метод в вашем cpp так, чтобы он выглядел следующим образом:

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

methodName () теперь будет доступен из вашего скомпилированного файла C.

0 голосов
/ 12 апреля 2011

Добавить в файл Android.mk:

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

Для каждого каталога, в котором есть .h файлов

0 голосов
/ 12 апреля 2011

Вы должны #include включать файлы .h, а не .c или .cpp.

...