2015-02-03 2 views
2

У меня вопрос о том, почему я не могу просто добавить новые общие библиотеки в 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 - упрощенная математика.

ответ

-1

Итак, у libndk1.so есть зависимость от libmath.so? Тогда было бы логично перестроить его, когда вы коснетесь источника libmath.

+0

Да, libndk1.so имеет зависимость от libmathadd.so. В частности, он использует вспомогательные функции из libmathadd. Однако у меня всегда создалось впечатление, что, пока заголовок функции не изменяется, оригинал не нужно будет перестраивать, когда изменена общая библиотека, поскольку код вспомогательной функции не статически компилируется в libndk1. – Stevecode

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

  • Нет связанных вопросов^_^