Привет, у меня странная проблема. Я создаю простое приложение для 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 заранее!
Вы должны включать только заголовки (или, альтернативно, использовать прототипы), чтобы файлы C могли компилироваться.
После компиляции вы все равно будете жаловаться на ошибку < undefined на `methodName '.
Это потому, что компиляторы С++ кодируют пространство имен методов внутри файла cpp. Он не делает этого для методов (или, что важно, для вызовов методов) внутри c файлов. Это означает, что скомпилированные c файлы не могут естественно обращаться к методам в скомпилированном С++-коде, даже если исходный код будет предлагать именно это.
Однако вы можете сообщить компилятору, что метод будет вызываться языком "C", поэтому он не будет кодировать пространство имен методов. Вы можете дать команду компилятору сделать это, изменив метод в вашем cpp, чтобы он выглядел следующим образом:
extern "C" int methodName()
{
return 1;
}
methodName() теперь будет доступен из вашего скомпилированного файла C.
Добавьте в свой Android.mk
файл:
LOCAL_C_INCLUDES := $(LOCAL_PATH)include_dir1 \
$(LOCAL_PATH)include_dir2 \
...
Для каждого каталога, где есть .h
файлы
Вы должны # включить файлы .h, а не .c или .cpp.