У меня вопрос о том, почему я не могу просто добавить новые общие библиотеки в Android без перекомпиляции через NDK-build. Вот что я делаю:Android NDK и отбрасывание новых общих библиотек
Используя Android Studio и недавнюю версию Android NDK, я смог скомпилировать приложение, которое использует код C, который относится к общей библиотеке. Я собираю общую библиотеку с:
GCC := /xxx/AndroidStudioProjects/android-ndk-r10d/toolchains/x86-4.6/prebuilt/windows/bin/i686-linux-android-gcc.exe
GPP :=/xxx/AndroidStudioProjects/android-ndk-r10d/toolchains/x86-4.6/prebuilt/windows/bin/i686-linux-android-g++.exe
AR := /xxx/AndroidStudioProjects/android-ndk-r10d/toolchains/x86-4.6/prebuilt/windows/bin/i686-linux-android-ar.exe
OPTIONS :=\
-ffunction-sections \
-funwind-tables \
-DANDROID
default: all
all: obj
$(AR) r libmathadd.so mathadd.o
obj:
$(GCC) $(OPTIONS) -c mathadd.c
Это дает мне мой файл .so. Теперь я бегу мой NDK-строить с Makefile Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mathadd
LOCAL_SRC_FILES :=./libmathadd.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_LDLIBS := -llog
LOCAL_MODULE := ndk1
LOCAL_SRC_FILES := native.c
LOCAL_SHARED_LIBRARIES := mathadd
include $(BUILD_SHARED_LIBRARY)
После этого у меня ndk1 .so файл и мой mathadd .so, который я затем поместить в директорию папки:
приложение -> ЦСИ -> jniLibs -> x86 -> libmathadd.so
и
приложение -> ЦСИ -> jniLibs -> x86 -> libndk1.so
я скомпилировать и запустить на моем эмуляторе, и канун бум rything работает!
Теперь вот моя проблема. Я немного изменяю свой источник совместно используемой библиотеки (mathadd.c). Я перекомпилирую его с помощью первого файла make и перетаскиваю его прямо в дерево приложений (без восстановления собственного кода c). Я перестраиваю приложение в Studio и запускаю свой эмулятор и замечаю, что мои модификации не произошли.
Я не изменяю свой родной источник, а также api между native и моей общей библиотекой.
Если я перестроил родной скрипт ndk-build и перетащил новый родной ndk1, все снова будет работать, включая новые модификации. Кажется, мне нужно перестроить источник через ndk каждый раз, когда я настраиваю общую библиотеку ... ??
Любые идеи?
UPDATE: Я открыл свою библиотеку libndk .so с помощью инструмента RE. Оказывается, компилятор ndk статически добавляет код libmathadd в libndk, несмотря на то, что он указан как локальная общая библиотека. Мне любопытно, если это связано с тем, что оптимизация по умолчанию установлена для максимальной скорости, а код libmathadd - упрощенная математика.
Да, libndk1.so имеет зависимость от libmathadd.so. В частности, он использует вспомогательные функции из libmathadd. Однако у меня всегда создалось впечатление, что, пока заголовок функции не изменяется, оригинал не нужно будет перестраивать, когда изменена общая библиотека, поскольку код вспомогательной функции не статически компилируется в libndk1. – Stevecode