РЕДАКТИРОВАНИЕ: решение в конце поста.
Я создаю разделяемую библиотеку для Android с использованием NDK r8d, используя пример проекта hello-jni из NDK и некоторые статические библиотеки, скомпилированные с помощью автономного набора инструментов ARM.
NDK-BUILD жалуется на неопределенную ссылку. Смотрите команду компоновщика и ее вывод:
c:/android/ndk/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/arm-linux-
androideabi-g++ -Wl,-soname,libhello-jni.so -shared --sysroot=c:/android/ndk/platforms
/android-9/arch-arm ./obj/local/armeabi/objs-debug/hello-jni/hello-jni.o ./obj/local
/armeabi/libDataProvider.a ./obj/local/armeabi/libPDF.a ./obj/local/armeabi/libMisc.a
./obj/local/armeabi/libNetwork.a ./obj/local/armeabi/libboost_filesystem.a ./obj/local
/armeabi/libcryptoeng.a ./obj/local/armeabi/libcryptopp.a ./obj/local/armeabi
/libMiniSstructs.a ./obj/local/armeabi/libOBSstructs.a ./obj/local/armeabi
/libSerialization.a ./obj/local/armeabi/libstdc++.a ./obj/local/armeabi
/libboost_iostreams.a ./obj/local/armeabi/libboost_thread.a ./obj/local/armeabi/libz.a
./obj/local/armeabi/libboost_system.a -no-canonical-prefixes -Wl,--no-undefined
-Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -lc -lm -o ./obj/local/armeabi/libhello-jni.soc:/android/ndk/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc
/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: ./obj/local
/armeabi/libNetwork.a(CertificatesManager.o): in function
OBInfo::GetVersionAsNumber():c:\trunk\src\libMisc/obinfo.h:19: error:
undefined reference to 'OBInfo::versionAsNumber'collect2: ld returned 1 exit status
Тем не менее, Н.М. говорит, что символ на самом деле там:
$ nm Tests/hello-jni/obj/local/armeabi/libMisc.a --demangle | grep versionAsNumber
00000000 D OBInfo::versionAsNumber
Упрощенный OBInfo.h:
class OBInfo
{
public:
static uint32_t GetVersionAsNumber() {return versionAsNumber;};
private:
static uint32_t versionAsNumber;
};
Упрощенный OBInfo.cpp
#include "obinfo.h"#include "version_info.h"uint32_t OBInfo::versionAsNumber = VERSION_AS_NUMBER;
Если я удалю -Wl, — no-undefined, компоновщик завершится без ошибок. Почему LD не находит символ, а NM находит? (Кстати: NM происходит от MSYS, а LD — от набора инструментов)
РЕДАКТИРОВАТЬ: Я решил проблему, изменяя порядок статических библиотек в переменной LOCAL_STATIC_LIBRARIES в Android.mk. Я также перекомпилировал некоторые из готовых библиотек, потому что некоторые были скомпилированы без оптимизации -O0, в то время как другие были оптимизированы с -O2.
Задача ещё не решена.
Других решений пока нет …