2013-07-10 123 views
0

我工作的一個項目靜態,在這個項目中,我有以下...問題與從外部訪問C++庫

項目1

JNIBox2DWorld.h

static b2World* world = NULL; 

JNIBox2DWorld.cpp

world = new b2World(gravity); 

現在,這似乎很好地工作,但我想,所以我創建一個新的項目和全球化志願服務青年的舊的頭文件,添加一個OpenGL渲染....

Project2的

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庫中,但是當我試着通過新代碼爲null訪問它....

D/Native (14119): in Draw

D/Native (14119): World is not set for some reason

爲什麼它顯示爲空時,我把它從我的新圖書館但從舊的罰款?既然它是靜態的,它不應該與兩者兼容?

回答

1

我想你可能會對靜態是什麼感到困惑。當你在一個編譯單元(通常是一個cpp文件)中聲明一個全局靜態變量時,這意味着該變量是本地到編譯單元和不能在其他地方看到。

由於您在包含在兩個單獨的cpp文件中的頭文件中聲明全局靜態變量,因此最終會導致名爲world的兩個非常不同的(編譯單位本地)全局變量。但是,在b2GLPolygonShape.cpp內創建的world變量與在JNIBox2DWorld.cpp中創建的變量無關。

什麼你可能想要做的是在你的頭文件中聲明的外部變量:(!)

example.h文件

extern b2World* world; 

在一個,但只有一個,CPP文件創建對象:

example.cpp

b2World* world = new b2World(gravity); 

在另一個cpp文件中,您可以使用該對象:

測試。cpp

#include <example.h> 

void foo() { 
    world->whatever(); 
} 

並且至少鏈接器應該沒問題。

但是,這種方式使用全局變量會帶來各種麻煩(例如,初始化的順序,只是最明顯的名稱),所以您通常應該尋找其他方法來實現您想要的。你被警告了。祝你好運:-)

+0

謝謝我想這是我成爲一名Java程序員所得到的結果:-)我會試試看,看看是否修復它。 – Jackie

+0

我認爲可能有一個不同的問題,因爲(如我所述)cpp文件在單獨的庫中。當我按照描述的方式進行操作時,似乎無法理解世界......「b2GLPolygonShape.cpp:6:錯誤:未定義引用'world'」如果需要,我可以發佈我的代碼。 – Jackie

+0

這可能是由於鏈接問題,因爲我可能沒有鏈接.so並只使用標題。讓我兩次檢查 – Jackie