本文使用Windows+NDKr8编译,编译前请自行配置好相关环境变量
Box2D是一个在手机游戏开发中使用的物理引擎,本文使用NDK将Box2D移植到Android
首先去Box2D官网下载最新版的源码,目前版本是2.2.1,下载地址是:Box2D_v2.2.1.zip
解压源码,删除源码目录中除Box2D以外的其它目录,将HelloWorld目录中的HelloWorld.cpp复制到源码根目录改名为Test.cpp
新建一个工程目录,命名为box2d-ndk,在此目录中新建目录jni,将上面整理好的Box2D源码全部移动到jni目录
在jni目录添加两个文件:
Android.mk,内容如下,编译静态库和动态库,还有一个测试文件:
LOCAL_PATH:= $(call my-dir) LS_CPP=$(subst $(1)/,,$(wildcard $(1)/$(2)/*.cpp)) BOX2D_CPP:= $(call LS_CPP,$(LOCAL_PATH),Box2D/Collision) \ $(call LS_CPP,$(LOCAL_PATH),Box2D/Collision/Shapes) \ $(call LS_CPP,$(LOCAL_PATH),Box2D/Common) \ $(call LS_CPP,$(LOCAL_PATH),Box2D/Dynamics) \ $(call LS_CPP,$(LOCAL_PATH),Box2D/Dynamics/Contacts) \ $(call LS_CPP,$(LOCAL_PATH),Box2D/Dynamics/Joints) \ $(call LS_CPP,$(LOCAL_PATH),Box2D/Rope) include $(CLEAR_VARS) LOCAL_MODULE:= box2d_static LOCAL_SRC_FILES:= $(BOX2D_CPP) LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/Box2D LOCAL_C_INCLUDES := $(LOCAL_EXPORT_C_INCLUDES) include $(BUILD_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE:= box2d LOCAL_SRC_FILES:= $(BOX2D_CPP) LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/Box2D LOCAL_C_INCLUDES := $(LOCAL_EXPORT_C_INCLUDES) include $(BUILD_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := Box2DTest LOCAL_SRC_FILES := Test.cpp #LOCAL_C_INCLUDES += $(LOCAL_PATH)/Box2D LOCAL_STATIC_LIBRARIES := box2d_static include $(BUILD_EXECUTABLE)
Application.mk,内容如下:
APP_PLATFORM := android-9 APP_STL := gnustl_static APP_CPPFLAGS := -fexceptions
打开命令行窗口,进入box2d目录,运行ndk-build,等待片刻,就会在libs/armeabi目录下生成libbox2d.so和Box2DTest两个文件,其中Box2DTest是arm二进制文件,可以使用adb push到手机中添加权限后直接运行,如果没有出错说明Box2D编译没有问题
使用时直接代码中 #include <Box2d/Box2D.h>,然后Android.mk中添加 LOCAL_STATIC_LIBRARIES := box2d_static 即可
修改好的源码可在此下载: https://github.com/mcxiaoke/box2d-ndk ,直接ndk-build即可编译