Как создать общую библиотеку и вызвать ее в другой программе ndk

Я хочу создать общую библиотеку. Чтобы построить его, мне нужно вызвать другую общую библиотеку. Вот что я сделал:

1. Создайте один проект Android под названием BuildLib и добавьте новую папку "jni" в каталог проекта. Содержимое папки jni:

JNI → Android.mk
     - > Application.mk
     - > add.cpp
     - > add.h add.cpp просто добавьте два числа:

add.h:

int add (int a, int b);

add.cpp:

#include "add.h"  
int add(int a,int b){
    return a+b;}

Android.mk:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES  := add.cpp 
LOCAL_MODULE     := add
include $(BUILD_SHARED_LIBRARY)

После сборки проекта я получил libadd.so в каталоге $(BUILDLIB)/libs/armeabi/.

Создайте еще один Android-проект под названием "CallLib". Скопируйте libadd.so и add.h в папку jni, создайте Android.mk, Application.mk и call_add.cpp.

Android.mk:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := libadd.so
LOCAL_MODULE := add_prebuilt
include $(PREBUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_C_INCLUDES := $(LOCAL_PATH)
LOCAL_SRC_FILES  := call_add.cpp 
LOCAL_MODULE     :=  native
LOCAL_SHARED_LIBRARIES := add_prebuilt
include $(BUILD_SHARED_LIBRARY)

call_add.cpp:

#include "add.h"
int call_add(){return add(1,2);}

В конце концов, я строю проект CallLib, но получил ошибку:

undefined ссылка на 'add (int, int)';

Я думаю, что libadd.so не может быть найден, но я не знаю, как его изменить. Кто-нибудь знает, как я могу это исправить? Любая помощь будет оценена.

Ответ 1

Во втором Android.mk попробуйте заменить первый модуль следующим:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := libadd.so
LOCAL_MODULE := add_prebuilt
LOCAL_EXPORT_C_INCLUDES := add.h
include $(PREBUILD_SHARED_LIBRARY)

Флаг LOCAL_EXPORT_C_INCLUDES должен прикреплять информацию заголовка к модулю add_prebuilt, поэтому он может быть связан с вашей окончательной библиотекой.

Ответ 2

На всякий случай кому-то это нужно:

Немного хакерский способ сохранить компоновщика счастливым:

LOCAL_LDLIBS := -llog

или

LOCAL_LDLIBS := -L$(LOCAL_PATH)/lib -lMyStuff

Меньше хаки:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := xyz
LOCAL_SRC_FILES += xyz/xyz.c
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)    # this builds libxyz.so


include $(CLEAR_VARS)
LOCAL_MODULE    := abc
LOCAL_SHARED_LIBRARIES := xyz    # <=== !!! this makes libabc.so dependent on libxyz.so
LOCAL_SRC_FILES := abc/abc.c
#LOCAL_LDLIBS := ...
include $(BUILD_SHARED_LIBRARY)    # this builds libabc.so