NDK r5 帶的 toolchain 終於可以支援 makefile 的編譯系統了。不過為了讓它支援 GNU libc++ 還頗費了一番功夫,文檔實在太缺乏了。下面是一個簡單的試成功了的 case:
首先我們寫一個簡單的 C++ 程式,這裡命名為 test.cpp,裡面用到了 iostream, vector, typeid,libc++ 的基本特性都包含在裡面了:
#include <vector><br />#include <iostream><br />#include <typeinfo><br />class A<br />{<br />public:<br /> virtual void func()<br /> {<br /> std::cout << "A" << std::endl;<br /> }<br />};<br />class B : public A<br />{<br />public:<br /> virtual void func()<br /> {<br /> std::cout << "B" << std::endl;<br /> }<br />};<br />int main(void)<br />{<br /> B * b = new B();<br /> A * a = dynamic_cast<A*>(b);<br /> if (a)<br /> {<br /> std::cout << "calling A::func()" << std::endl;<br /> a->func();<br /> std::cout << "typeid=" << typeid(*a).name() << std::endl;<br /> }<br /> else<br /> {<br /> std::cerr << "dynamic_cast error." << std::endl;<br /> }<br /> std::vector<int> v;<br /> v.push_back(1);<br /> std::cout << v.size() << std::endl;<br /> return 0;<br />}<br />
然後我們來寫我們的 makefile:
NDK_HOME=/Developer/android-ndk-r5<br />TOOLCHAIN_HOME=$(NDK_HOME)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86<br />CROSS_COMPILE=$(TOOLCHAIN_HOME)/bin/arm-linux-androideabi-<br />SYSROOT=$(NDK_HOME)/platforms/android-3/arch-arm<br />CC=$(CROSS_COMPILE)g++<br />STL_HOME=$(NDK_HOME)/sources/cxx-stl/gnu-libstdc++<br />NDK_LIB=$(SYSROOT)/usr/lib<br />#CCFLAGS=-MMD -MP -fpic -ffunction-sections -funwind-tables -fstack-protector -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -Wno-psabi -march=armv5te -mtune=xscale -msoft-float -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -DANDROID -Wa,--noexecstack -g<br />CCFLAGS=<br />INCDIRS += -I$(SYSROOT)/usr/include<br />INCDIRS += -I$(STL_HOME)/include<br />INCDIRS += -I$(STL_HOME)/libs/armeabi/include<br />LDFLAGS += --sysroot=$(SYSROOT) -L$(NDK_LIB)<br />#LDFLAGS += -Wl,--gc-sections -Wl,-z,nocopyreloc -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-rpath-link=$(SYSROOT)/usr/lib<br />#LDFLAGS += -lsupc++ -lstdc++<br />#LDLIBS += $(TOOLCHAIN_HOME)/arm-linux-androideabi/lib/libsupc++.a<br />#LDLIBS += $(TOOLCHAIN_HOME)/lib/gcc/arm-linux-androideabi/4.4.3/libgcc.a<br />#LDLIBS += $(SYSROOT)/usr/lib/libc.a<br />LDLIBS += $(STL_HOME)/libs/armeabi/libstdc++.a<br />OUTPUT=test<br />hello: test.o<br /> $(CC) $(LDFLAGS) test.o $(LDLIBS) -o $(OUTPUT)<br />test.o: test.cpp<br /> $(CC) $(CCFLAGS) $(INCDIRS) -c test.cpp -o test.o<br />clean:<br /> rm -f *.o<br />
make,編譯成功,上傳到 emulator 裡面運行結果:
calling A::func()
B
typeid=1B
1
正常。