2012-01-09 66 views
4

我在Ubuntu上使用Eclipse + Qualcomm庫(在cpp中)+ Android SDK。我的應用運行良好。如果我改變了Qualcomm庫中的一些代碼,它會編譯並正常工作。在cpp中使用define宏替換函數的名稱

問題是:我已經改變了項目的名稱,並且我必須在cpp(函數的名稱)中更改一些代碼,如果我不這樣做,我會得到一個Java.lang.UNSATISFIEDLINKERROR

這是因爲所有的功能有名字作爲Android包這樣的:

Java_org_myproject_marker_MainActivity_onQCARInitializedNative(JNIEnv *, jobject) 

然後我定義一個宏是這樣的:

#define MAIN_ACTIVITY_PREFIX org_myproject_marker_MainActivity 
#define VISUALIZER_PREFIX org_myproject_marker_Visualizer 

而且我通過改變所有正確的功能:

Java_MAIN_ACTIVITY_PREFIX_onQCARInitializedNative(JNIEnv *, jobject) 

但我仍然得到Java.lang.UNSATISFIEDLINKERROR異常。

它的工作原理如果我沒有使用#define宏(並且寫出所有行),但是我想用頂端定義保存cpp代碼,如果我需要在其他項目中使用它,它會自動更改所有內容。我已閱讀this tutorial。我不能替換另一個文本內的文本或類似的東西?

回答

6

您正在尋找字符串連接,像這樣:

#define MAIN_ACTIVITY_PREFIX(n) Java_org_myproject_marker_MainActivity##n 

,然後用它是這樣的:

MAIN_ACTIVITY_PREFIX(_onQCARInitializedNative)(JNIEnv *, jobject) 
+0

非常感謝,解決了問題 – vgonisanz 2012-01-09 09:07:00

7

事實上,CPP宏不會在標識符中間展開。試着用

#define MAIN_ACTIVITY_PREFIX(func) Java_org_myproject_marker_MainActivity##func 

這就給了你一個宏,將預先準備Java_org_myproject_marker_MainActivity給你傳遞給它的函數名。用它作爲:

MAIN_ACTIVITY_PREFIX(_onQCARInitializedNative)(JNIEnv *, jobject) { 
    ... 
} 
+0

非常感謝,解決了問題 – vgonisanz 2012-01-09 09:06:17