2

Я прочитал другие вопросы, подобные этому при переполнении стека, но они не имеют одинакового сценария.Создание общей библиотеки из статической библиотеки * .a file

У меня есть файл FreeImage.a (23 МБ), который предварительно создает статическую библиотеку для Android. У меня также есть исходный код проекта FreeImage, у которого есть файлы заголовков.

Я хочу построить .SO файл из файла ( .а) я с моим JNI кода (FreeImageCompilation.cpp) Ниже код компилируется нормально, но это не производит SO файл (только 5KB) whre (*. файл - 23 МБ)?

может кто-нибудь проверить, соответствует ли мой код ниже для использования * .a файла или нет?

В моем Android.mk У меня есть следующий код.

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_MODULE := FreeImage 
LOCAL_SRC_FILES := libFreeImage.a 
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/FreeImage/Source/ 
include $(PREBUILT_STATIC_LIBRARY) 

#My Own SO file 

LOCAL_STATIC_LIBRARIES := FreeImage 
include $(CLEAR_VARS) 
LOCAL_MODULE := FreeImageSo 
LOCAL_SRC_FILES := FreeImageCompilation.cpp 
LOCAL_STATIC_LIBRARIES := FreeImage 
include $(BUILD_SHARED_LIBRARY) 

ответ

0

Это совершенно правильно, но вы, кажется, смущены понятиями. Ваша статическая библиотека не включена в вашу общую библиотеку, как вы, кажется, ожидаете. Ваша статическая библиотека просто связана с общей библиотекой. В конце концов, вашей программе нужен файл .so и .a для правильной работы, а не только один большой .so, который содержит все.

+0

, что означает, что скомпилированные SO файл правильно, и мне нужно положить . * .a файл с SO-файлом при упаковке apk? – Kirtan

+0

Согласно сайту WinGDB: «Статическая библиотека - это утилитная библиотека, которая может использоваться как компонент для создания разделяемых библиотек. Она отсутствует в файле APK и не установлена ​​на устройство. Код Java не может загрузить его во время выполнения Статические библиотеки создаются в папку {output dir}/obj/local/{ABI name}. Это также промежуточная папка для разделяемых библиотек, однако последние автоматически копируются в конечный пункт назначения в {output dir}/libs/{ABI name}. Статические библиотеки остаются в промежуточной папке, где они доступны для компоновщика для создания разделяемых библиотек. " – eozgonul

+0

Поэтому вам не нужно размещать файлы .a в APK. Это необходимо обработать в процессе связывания. – eozgonul

1

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

# static library 1 
include $(CLEAR_VARS) 
LOCAL_MODULE := lib1 
LOCAL_SRC_FILES := lib1.cpp 
include $(BUILD_STATIC_LIBRARY) 

# static library 2 
include $(CLEAR_VARS) 
LOCAL_MODULE := lib2 
LOCAL_SRC_FILES := lib2.cpp 
include $(BUILD_STATIC_LIBRARY) 

# this shared library will have all symbols from two above libraries 
include $(CLEAR_VARS) 
LOCAL_MODULE := lib_shared 
LOCAL_SRC_FILES := empty.cpp 
LOCAL_WHOLE_STATIC_LIBRARIES := lib1 lib2 
include $(BUILD_SHARED_LIBRARY) 

Важная опция отметить, LOCAL_WHOLE_STATIC_LIBRARIES. Если вы используете обычный LOCAL_STATIC_LIBRARIES, потому что вы не используете никаких символов от lib1 или lib2 в lib_shared, они будут удалены во время соединения. Чтобы предотвратить это LOCAL_WHOLE_STATIC_LIBRARIES добавляет следующие варианты, чтобы связать линию, чтобы убедиться, что символы не удаляются:

-Wl,--whole-archive -llib1 -llib2 -Wl,--no-whole-archive 

Больше информации в моем блоге здесь: http://gosuwachu.io/

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