我正在研究一个项目,在这个项目中我有以下内容......
JNIBox2DWorld.h
static b2World* world = NULL;
JNIBox2DWorld.cpp
world = new b2World(gravity);
现在这似乎工作正常,但我想添加一个OpenGL渲染器,所以我创建一个新项目并重新引用旧的头文件....
b2GLPolygonShape.h
#include <Box2D/JNIBox2DWorld.h>
...
class b2GLPolygonShape
{
public:
void Draw();
void Draw(b2PolygonShape* s);
};
b2GLPolygonShape.cpp
#include "b2GLPolygonShape.h"
void b2GLPolygonShape::Draw(){
LOGD("in Draw");
if(world == NULL){
LOGD("World is not set for some reason");
}
else{
LOGD("World is set");
}
}
我看到世界在Box2D库中工作但是当我尝试通过我的新代码访问它时它是空的....
D / Native(14119):在Draw中
D / Native(14119):由于某种原因未设置世界
为什么当我从我的新图书馆调用它时它显示为null但是从旧版本可以正常工作?既然它是静态的,它不应该同时适用于它们吗?
答案 0 :(得分:1)
我认为你可能会对静态做什么感到困惑。在编译单元(通常是cpp文件)中声明全局静态变量时,这意味着该变量是 local 到编译单元,不能在别处看到。
由于您在头文件中声明了一个包含在两个单独的cpp文件中的全局静态变量,因此最终会导致两个非常不同的(编译单元本地)全局变量名为world
。但是,world
中创建的b2GLPolygonShape.cpp
变量与JNIBox2DWorld.cpp
中创建的变量无关。
您可能想要做的是在头文件中声明一个外部变量:
<强> example.h文件强>
extern b2World* world;
并在一个,但只有一个(!),cpp文件创建对象:
<强> example.cpp 强>
b2World* world = new b2World(gravity);
在另一个cpp文件中,您可以使用该对象:
<强> TEST.CPP 强>
#include <example.h>
void foo() {
world->whatever();
}
并且至少链接器应该没问题。
然而,使用全局变量会带来各种麻烦(例如初始化顺序,只是为了说明最明显的),所以你通常应该寻找 其他方式来实现你想要的。你被警告了。祝你好运: - )