如果大家有留意的话,就知道现在很流行的 愤怒的小鸟 的物理引擎是使用了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*&)'

:0: note: candidates are: void* operator new(unsigned int)

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

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

那Android.mk就这样写了

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := helloworld

LOCAL_ARM_MODE := arm

LOCAL_SRC_FILES := HelloWorld.cpp

LOCAL_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 := libbox2d

include $(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.cpp

LOCAL_MODULE := box2d

LOCAL_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

//float32 infinity = std::numeric_limits::infinity(); 修改为以下

float32 infinity = INFINITY;

/***************************************************************************************************/

Box2D/Collision/b2BroadPhase.h 注释#include

// 添加一个头文件 #include

// 添加一个方法

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

添加头文件 #include

/***************************************************************************************************/

Box2D/Common/b2BlockAllocator.cpp //#include 注释掉

// 添加头文件

#include

//#include 注释掉

// 添加头文件

#include

/***************************************************************************************************/

Box2D/Common/b2Settings.cpp

//#include 注释掉

// 添加头文件

#include

/***************************************************************************************************/

Box2D/Dynamics/b2Body.cpp

// 添加头文件

#include

/***************************************************************************************************/

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

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

修改过的源码下载地址 :

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

android2.2编译,Android NDK编译Box2D_V2.2相关推荐

  1. 【错误记录】Android NDK 编译报错 ( no known conversion from ‘unsigned char *‘ to ‘const char *‘ )

    文章目录 一.报错信息 二.解决方案 一.报错信息 在 Visual Studio 2019 中编译 Android NDK , 构建方式参考 [Android 逆向]Android 进程注入工具开发 ...

  2. Android NDK编译中在libs\armeabi中加入第三方so库文件的方法

    Android NDK编译中在libs\armeabi中加入第三方so库文件的方法 假设要加入库文件的名字为libffmpeg.so文件 1.要在project\jni目录下新建一目录prebuilt ...

  3. android.mk ndk编译选项优化,Android NDK 编译脚本分析 之一

    版权信息:本文为本人原创,欢迎转载,但请著明出处,并保留本版权信息. Android NDK编译脚本编写起来还是是比较简单条理的,然而它的语法和传统的linux GNU Make编译脚本的编写似乎有很 ...

  4. NDK编译php,Android NDK编译常见错误及解决方案

    Android NDK编译常见错误及解决方案 Error 1:$ ndk-build/cygdrive/c/andy/abc/obj/local/armeabi-v7a/objs/abc//hello ...

  5. Android NDK 编译PjSip 2.6 之 搭建PjSip apk开发环境 (三)

    Android NDK 编译PjSip 2.6 之 PjSip编译 (二)中已经把so 和java文件编译出来.可以开始搭建apk的开发环境. 我们导入PjSip的example apk程序,编译生成 ...

  6. android jni不适用ndk,Android NDK编译之undefined reference to 'JNI_CreateJavaVM'

    利用Android NDK编译动态库,在C文件中调用了两个JNI函数:JNI_GetDefaultJavaVMInitArgs和JNI_CreateJavaVM.编译的时候始终报以下错误: XXX: ...

  7. android中ndk编译错误,Android NDK编译常见错误及解决方案

    Android NDK编译常见错误及解决方案 Error 1:$ ndk-build/cygdrive/c/andy/abc/obj/local/armeabi-v7a/objs/abc//hello ...

  8. android 编译 sdl,使用android ndk编译SDL2示例错误r14

    我已经测试过在我的ubuntu 16.04机器上构建SDL2源代码(2.0.5)中的示例.使用android ndk编译SDL2示例错误r14 根据https://wiki.libsdl.org/An ...

  9. ugui 转轮_Unity3D研究院之Android NDK编译C/C++结合Unity实现本地数据共享(二十八)...

    开始本篇文章之前我先为大家简单的介绍一下Android NDK编程的原理, 我们知道Android开发使用JAVA语言来编程它的运行效率要比C/C++低很多,为了让JAVA语言可以调用 C/C++ 这 ...

最新文章

  1. java类获取声明,获取用于MethodInvocation的实际类而不是声明类 - java
  2. 调用枚举接口重写方法提示找不到符号_看看人家那后端API接口写得,那叫一个巴适~...
  3. 监控程序崩溃重启_第十四章 Homeassistant服务器安全及状态监控(下)
  4. 被惊艳到了!适用 Win、Mac、Linux,酷炫的极客界面 eDEX-UI
  5. Android 换肤功能的实现(Apk插件方式)
  6. Hadoop平台简述
  7. 简单工厂模式-Simple Factory Pattern
  8. iOS - 数组字典模型根据模型属性key排序
  9. 能直接替代替换RC522/CV520的13.56MHz高频读写芯片,太棒了
  10. python使用moviepy包下的VideoFileClip时报错:OSError: [WinError 6] 句柄无效解决方法
  11. eclipse开发桌面应用软件程序教程
  12. 智能水杯设计方案_智能水杯方案的结构、理念、特点
  13. 自动编码器在野外去除遮挡_在野外作曲
  14. eclipse与DW联合开发java web项目
  15. Log4j写日志文件使用详解
  16. 基于Matlab软件的视觉导航系统的仿真
  17. java计算机毕业设计-线上自助旅游报名网-源程序+mysql+系统+lw文档+远程调试
  18. 人民币升值和贬值的影响
  19. C语言电话号码判断合法性
  20. nCode:DesignLife案例教程十八

热门文章

  1. 想让关系更好就不要怕麻烦
  2. pycharm设置编写的脚本页面长行实现自动换行(windows版)
  3. Python机器学习——Agglomerative层次聚类
  4. 预测汽车级Linux专业技术的需求
  5. web站点的欢迎页面
  6. [JAVAEE] 初识ThymeLeaf
  7. mysql屏蔽关键字实现方法_PHP屏蔽过滤指定关键字的方法
  8. python 2x xlrd使用merged_cells 读取的合并单元格为空
  9. Waiting for target device to come online
  10. Binary XML file line #39: 最多只支持3个子View,Most only support three sub vi