如果大家有留意的话,就知道现在很流行的 愤怒的小鸟 的物理引擎是使用了Box2D,那么如何将这好东西移植到Android上呢?在网上找了一遍,发现资料还是少得可怜,于是自己研究研究一下,遇到问题就google一下~

其实用ndk编译Box2D,无非就是那么几个问题:

Box2D/Common/b2Math.h:27:18: error: limits: No such file or directory
Box2D/Collision/b2BroadPhase.h:25:21: error: algorithm: No such file or directory
Box2D/Dynamics/b2Body.h:24:18: error: memory: No such file or directory
Box2D/Common/b2Math.h:39: error: 'numeric_limits' is not a member of 'std'
Box2D/Common/b2Math.h:39: error: '::infinity' has not been declared
Box2D/Collision/b2BroadPhase.h:207: error: 'sort' is not a member of 'std'
Box2D/Common/b2BlockAllocator.cpp:20:
android/android-ndk-r5b/sources/cxx-stl/system/include/cstdlib:53: error: '::clearenv' has not been declared
Box2D/Common/b2Settings.cpp:20:


Box2D/Dynamics/b2Body.cpp:162: error: no matching function for call to 'operator new(unsigned int, void*&)'
<built-in>:0: note: candidates are: void* operator new(unsigned int)

将这些问题逐个击破就可以了。


我使用的测试例子是Box2D自带的HelloWorld

那Android.mk就这样写了

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := helloworldLOCAL_ARM_MODE := armLOCAL_SRC_FILES := HelloWorld.cppLOCAL_C_INCLUDES += $(LOCAL_PATH) \    $(LOCAL_PATH)/Box2D \    $(LOCAL_PATH)/Collision \    $(LOCAL_PATH)/Common \    $(LOCAL_PATH)/Dynamics \    $(LOCAL_PATH)/Rope#LOCAL_LDIBS := -lstdc++LOCAL_STATIC_LIBRARIES := libbox2dinclude $(BUILD_EXECUTABLE)##################################include $(call all-makefiles-under,$(LOCAL_PATH))

目的是生成 一个可执行的文件。

以下是编译Box2D的文件,目的是生成一个静态连接库:

Android.mk

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)BOX2D_SRC_FILES += \Collision/b2BroadPhase.cpp \Collision/b2CollideCircle.cpp \Collision/b2CollideEdge.cpp \Collision/b2CollidePolygon.cpp \Collision/b2Collision.cpp \Collision/b2Distance.cpp \Collision/b2DynamicTree.cpp \Collision/b2TimeOfImpact.cpp \Collision/Shapes/b2ChainShape.cpp \Collision/Shapes/b2CircleShape.cpp \Collision/Shapes/b2EdgeShape.cpp \Collision/Shapes/b2PolygonShape.cpp \Common/b2BlockAllocator.cpp \Common/b2Draw.cpp \Common/b2Math.cpp \Common/b2Settings.cpp \Common/b2StackAllocator.cpp \Common/b2Timer.cpp \Dynamics/b2Body.cpp \Dynamics/b2ContactManager.cpp \Dynamics/b2Fixture.cpp \Dynamics/b2Island.cpp \Dynamics/b2World.cpp \Dynamics/b2WorldCallbacks.cpp \Dynamics/Contacts/b2ChainAndCircleContact.cpp \Dynamics/Contacts/b2ChainAndPolygonContact.cpp \Dynamics/Contacts/b2CircleContact.cpp \Dynamics/Contacts/b2Contact.cpp \Dynamics/Contacts/b2ContactSolver.cpp \Dynamics/Contacts/b2EdgeAndCircleContact.cpp \Dynamics/Contacts/b2EdgeAndPolygonContact.cpp \Dynamics/Contacts/b2PolygonAndCircleContact.cpp \Dynamics/Contacts/b2PolygonContact.cpp \Dynamics/Joints/b2DistanceJoint.cpp \Dynamics/Joints/b2FrictionJoint.cpp \Dynamics/Joints/b2GearJoint.cpp \Dynamics/Joints/b2Joint.cpp \Dynamics/Joints/b2MouseJoint.cpp \Dynamics/Joints/b2PrismaticJoint.cpp \Dynamics/Joints/b2PulleyJoint.cpp \Dynamics/Joints/b2RevoluteJoint.cpp \Dynamics/Joints/b2RopeJoint.cpp \Dynamics/Joints/b2WeldJoint.cpp \Dynamics/Joints/b2WheelJoint.cpp \Rope/b2Rope.cppLOCAL_MODULE := box2dLOCAL_C_INCLUDES += $(LOCAL_PATH) \    $(LOCAL_PATH)/../LOCAL_SRC_FILES := $(BOX2D_SRC_FILES)include $(BUILD_STATIC_LIBRARY)

好了,准备的功夫就绪了,ndk-build吧。

然后就XXXXXXXXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXXXXX

一堆错误。

毕竟ndk编译还是有一点不足,那么我们就要对源码进行移向的修改,修改记录如下:

/***************************************************************************************************/Box2D/Common/b2Math.h    注释#include <limits>//float32 infinity = std::numeric_limits<float32>::infinity(); 修改为以下float32 infinity = INFINITY;/***************************************************************************************************/Box2D/Collision/b2BroadPhase.h   注释#include <algorithm>// 添加一个头文件  #include <stdlib.h>// 添加一个方法static int b2PairQSORTLessThan (const void*element1, const void*element2){b2Pair *pair1 = (b2Pair*)element1;b2Pair *pair2 = (b2Pair*)element2;if (pair1->proxyIdA < pair2->proxyIdA)return -1;else if (pair1->proxyIdA > pair2->proxyIdA)return 1;else {if (pair1->proxyIdB < pair2->proxyIdB)return -1;else if (pair1->proxyIdB > pair2->proxyIdB)return 1;}return 0;}//std::sort(m_pairBuffer, m_pairBuffer + m_pairCount, b2PairLessThan);修改为以下qsort (m_pairBuffer, m_pairCount, sizeof (b2Pair), b2PairQSORTLessThan);/***************************************************************************************************/Box2D/Dynamics/b2Body.h  注释#include <memory>  添加头文件 #include <memory.h>/***************************************************************************************************/Box2D/Common/b2BlockAllocator.cpp  //#include <memory> 注释掉   // 添加头文件    #include <memory.h>  //#include <cstdlib> 注释掉  // 添加头文件           #include <stdlib.h>/***************************************************************************************************/Box2D/Common/b2Settings.cpp//#include <cstdlib> 注释掉// 添加头文件#include <stdlib.h>/***************************************************************************************************/Box2D/Dynamics/b2Body.cpp// 添加头文件#include <new>/***************************************************************************************************/

好了,好了,再编译一下吧。一切顺利了吧~

最后会生成 helloworld的可执行文件,将它push 到模拟器运行一下,好了,没问题了~



修改过的源码下载地址 :

http://download.csdn.net/detail/feifei454498130/3583581


个人是比较懒了,不想多说了。^^


更多相关文章

  1. Android使用代码进行界面布局和改变图标、标题、名称、主界面
  2. android开发环境建立以及开发工具的使用--怎样使用eclipse来开发
  3. Android学习-SharedPreferences接口的学习
  4. Android官方技术文档翻译——新构建系统概述
  5. Android(安卓)热更新是如何实现的?
  6. java 打印日志
  7. Android(安卓)RenderScript 的使用基础篇
  8. Android应用程序反编译
  9. Android之VOLD文件结构分析

随机推荐

  1. Android的Handler机制
  2. Android(安卓)simple implementation Dro
  3. 7种形式的Android(安卓)AlertDialog使用
  4. iOS学习计划——轻松开心慢慢来
  5. Android设计模式学习之Builder模式
  6. Android全局代理软件ProxyDroid和TransPr
  7. 【Android(安卓)UI】 Shape详解
  8. Android(安卓)热修复一(热修复流程原理)
  9. Android(安卓)DOM解析xml
  10. android 制作.9.png图片