Я создал файл заголовка «abc.h» с декларациейКак связать статическую библиотеку в jni?
int abc();
Затем я создал файл .cpp «abc.cpp» с определением
int abc()
{
return 0;
}
Теперь я создал статическую библиотеку libabc.a из вышеперечисленных файлов.
Я создал проект HelloWorld для Android. Затем я создал в нем папку jni с подпапками «header» и «src». В папке заголовка я поместил abc.h и в папку src я поставил «abc.cpp». Теперь я создал еще один файл «xyz.cpp» в jni-папке, который хочет использовать функцию abc(). Но когда я запускаю команду ndk-build, я получаю эту ошибку. JNI/JNIMagicCleanManager.cpp: 84: ошибка: неопределенная ссылка на функцию аЬс (что-то вроде этого)
Как получить определение ABC() с статической библиотеки libabc.a я поставил libabc.a в той же папке параллельно на Android.mk. Ниже мой Android.mk файл
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
MAGIC_CLEAN_ROOT := ..
MAGIC_CLEAN_SRC_ROOT := ../$(LOCAL_PATH)/src
MAGIC_CLEAN_SRC_FILES := xyz.cpp
MAGIC_CLEAN_C_INCLUDES := $(LOCAL_PATH)/headers/
LOCAL_STATIC_LIBRARIES := magicClean
LOCAL_MODULE := myJniLib2
LOCAL_SRC_FILES := $(MAGIC_CLEAN_SRC_FILES)
LOCAL_C_INCLUDES := $(MAGIC_CLEAN_C_INCLUDES)
LOCAL_C_INCLUDES += .
include $(BUILD_SHARED_LIBRARY)
Edit 1: Многие спрашивают, почему у меня есть abc.cpp, когда у меня есть статическая библиотека, это только для поддержания только кода. Расскажите, как вызвать функцию из статической библиотеки.
'LOCAL_C_INCLUDES = .' <- не может быть связано с вашим вопросом, но это должно быть': = 'вместо' = '? – Michael
Кажется, вам нужно установить 'LOCAL_LDLIBS', см. Http://stackoverflow.com/questions/6475944/how-to-mention-path-of-libraries-in-android-mk-file-or-application-mk -файл. - И почему ваш 'MAGIC_CLEAN_SRC_ROOT' установлен в папку' headers'? - Я смущен тем, почему вы создаете статическую библиотеку, а затем включаете ее источники в сборку вашего проекта. Либо включайте только заголовки и ссылку на библиотеку, либо пропустите шаг библиотеки и включите заголовок + источник. – JimmyB
@Michael Пожалуйста, см. Мой Android.mk снова –