неопределенная ссылка при включении локального заголовочного файла в Android NDK

1

Привет, у меня странная проблема. Я создаю простое приложение для Android, которое использует ndk с JNI. Приложение имеет файл .cpp(debugTest.cpp), который используется для связи java и С++ с jni и другим .c(javaEssentials.c) файлом с его заголовком (javaEssentials.h). Когда я включаю в .cpp файл, файл .c(#include "javaEssentials.c" ) при компиляции не сообщается об ошибке. Когда я включаю в .cpp файл заголовок, компилятор сообщает об ошибке undefined ссылки на функции файла .c. Это настоящая странная проблема, и я не могу понять, почему это происходит. Как обычно, у меня есть объявление include в файле заголовка в .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)

Любые идеи, почему это происходит?

Thanx заранее!

Теги:
android-ndk
header
jni
include

3 ответа

5

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

После компиляции вы все равно будете жаловаться на ошибку < undefined на `methodName '.

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

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

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

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

0

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

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

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

  • 0
    Опять не работает ... я должен включить в LOCAL_SRC_FILES все файлы или только файл, который использует интерфейс JNI?
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню