У меня есть статическая библиотека Foo, которая используется общей библиотекой Bar. Bar - это встроенная общая библиотека, загружаемая моим приложением для Android. Foo содержит функции JNI, которые вызываются только кодом Java, а не кодом C ++ в Bar. Из-за этого эти функции JNI удаляются из статической библиотеки (Foo) при создании разделяемой библиотеки (Bar). Я' В настоящее время я использую слегка хакерский метод, чтобы предотвратить это.
Так, в этом случае, есть ли способ сказать компилятору, чтобы он не удалял функции JNI (или любые другие) при связывании?
Их не раздевают, их игнорируют. Когда разделяемая библиотека связана, компоновщик извлекает только объектные файлы с фактически используемыми функциями. (Именно так определяются статические библиотеки для работы.)
Я считаю, что передача компоновщику флага «--whole-archive» заставит его получить все объектные файлы из статической библиотеки. Вы можете указать его в строке ссылки gcc с помощью "-Wl, -whole-archive". Вам нужно следовать за ним с помощью «-Wl, -no-all-archive» после указания вашей библиотеки, иначе ld продолжит поведение для любых других статических библиотек, с которыми он сталкивается, что, вероятно, не то поведение, которое вы хотите. См. Также справочную страницу ld (1) в системе Linux.
Другой способ сделать то же самое - вывести один массивный файл .o вместо файла .a.
РЕДАКТИРОВАТЬ: Простой пример командной строки с использованием libz на рабочем столе:
% echo "int main() { return 0; }" > foo.c
% gcc -o foo /usr/lib/libz.a foo.c
% ls -s foo
12 foo*
% gcc -o foo -Wl,-whole-archive /usr/lib/libz.a -Wl,-no-whole-archive foo.c
% ls -s foo
104 foo*
(Здесь вы должны использовать «/usr/lib/libz.a» вместо «-lz», потому что последний находит общую библиотеку / usr / lib / libz .so.)
Я нечасто использовал NDK, но похоже, что добавление флагов к LOCAL_LDFLAGS может помочь.