2014-11-27 3 views
0

Я создал файл заголовка «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, когда у меня есть статическая библиотека, это только для поддержания только кода. Расскажите, как вызвать функцию из статической библиотеки.

+0

'LOCAL_C_INCLUDES = .' <- не может быть связано с вашим вопросом, но это должно быть': = 'вместо' = '? – Michael

+0

Кажется, вам нужно установить '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

+0

@Michael Пожалуйста, см. Мой Android.mk снова –

ответ

1

Перед использованием LOCAL_STATIC_LIBRARIES вам необходимо использовать PREBUILT_STATIC_LIBRARY, как в этом примере, в этом примере используется gnu static lib, но для вас это тоже самое.

include $(CLEAR_VARS) 

LOCAL_MODULE   := gnustl_static 
LOCAL_CPPFLAGS += -std=c++11 
LOCAL_SRC_FILES   := ${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi/thumb/libgnustl_static.a 
LOCAL_EXPORT_C_INCLUDES := ${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi/include 
LOCAL_EXPORT_C_INCLUDES += ${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/4.9/include/ 

include $(PREBUILT_STATIC_LIBRARY) 

Вы должны положить, что в вашем Android.mk

Смежные вопросы