Компиляция библиотеки C для Android, но символы не найдены

Я пытаюсь скомпилировать простую библиотеку C для Android, но в результате библиотека не содержит никаких символов / объектов! Я проверяю библиотеку, используя nm команда.

Это Android.mk:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := my_lib_static
LOCAL_MODULE_FILENAME := libmylib

LOCAL_C_INCLUDES := $(LOCAL_PATH)

LOCAL_SRC_FILES := File1.c File2.c 

include $(BUILD_SHARED_LIBRARY)
# or include $(BUILD_STATIC_LIBRARY)

РЕДАКТИРОВАТЬ:

Создается подпапка "objs", в которой есть все символы.

РЕДАКТИРОВАТЬ:

Это вывод gobjdump:

MyLibBot.o:     file format elf32-littlemips

gobjdump: MyLibBot.o: not a dynamic object
DYNAMIC SYMBOL TABLE:
no symbols



MyLibCommon.o:     file format elf32-littlemips

gobjdump: MyLibCommon.o: not a dynamic object
DYNAMIC SYMBOL TABLE:
no symbols



MyLibGameLogic.o:     file format elf32-littlemips

gobjdump: MyLibGameLogic.o: not a dynamic object
DYNAMIC SYMBOL TABLE:
no symbols



MyLibUndoStack.o:     file format elf32-littlemips

gobjdump: MyLibUndoStack.o: not a dynamic object
DYNAMIC SYMBOL TABLE:
no symbols

2 ответа

Решение

Вы должны указать флаг -D для nm, если хотите, чтобы он отображал динамические символы.

Вы также можете использовать флаг -T для objdump

Вам следует использовать версии nm или objdump, представленные в ndk, а не версии, которые можно найти для управления библиотеками хоста разработки. Они будут найдены в папке toolchains/ ndk и будут иметь префиксные имена, например arm-linux-androideabi-nm

Например, (в системе, которую я некоторое время не использовал для работы с Android, поэтому в ней содержится устаревшая версия - вам придется проявить изобретательность, чтобы найти то, что применимо к вашей системе):

$NDK/android-ndk-r7b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-nm -D mylibrary.so

У меня похожая проблема. Вы можете обойти эту нестандартную сборку так, чтобы -lotherlib передавался как последний аргумент. Например:

$ /path/to/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc \
--sysroot=/path/to/platforms/android-19/arch-arm \
-L/usr/local/src/lua-5.1.5/src -shared -lm -o mylibrary.so milibrary.o \
-lotherlib

Я не эксперт по Си, поэтому мне потребовались дни, чтобы понять:P, не уверен, почему -l должен идти в самом конце...

Другие вопросы по тегам