編集済み:投稿の最後にある解決策。
NDK r8d、NDK のサンプル プロジェクト hello-jni、および ARM スタンドアロン ツールチェーンでコンパイルされたいくつかの静的ライブラリを使用して、Android 用の共有ライブラリを構築しています。
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.so
c:/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 は、シンボルが実際に存在すると述べています。
$ 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 はツールチェーンに由来します)
編集: Android.mk LOCAL_STATIC_LIBRARIES 変数で静的ライブラリの順序を変更する問題を解決しました。また、ビルド済みライブラリの一部を再コンパイルしました。これは、最適化なしで -O0 でコンパイルされたものもあれば、-O2 で最適化されたものもあったためです。