1. 程式人生 > >android底層庫libutils之string8,string16研究

android底層庫libutils之string8,string16研究

toUpper:ARMWIND IS A GOOD MAN! ^_^
lockBuffer:ARMWIND IS A GOOD MAN! ^_^
lockBuffer_test:ARMWIND IS A GOOD MAN! ^_^
name:hello
name:hello is a good boy!
clear:
format:hello p

分析:上面的程式碼只是部分main函式,完整的程式碼大家可以下載附件,除了initialize_string()和terminate_string()函式,其它的函式都是在探究一下string8的特性。目前在呼叫format函式時,輸出的結果並不是我們意向中的“hello world”,這裡可能在移植到x86下,一些資料型別不匹配導致的吧。具體原因我就不找了,如果大家找到原因了,可以貼到評論上^_^,此外示例原始碼中android_atomic_add()函式也存在問題,即在執行+1,-1操作時,沒有將修改後的值賦給引用計數器(大家下載下來自己動手改改吧,我就不上傳了)。這樣就會導致後面lockbuffer()時探索遇到了點問題。

開始和結尾的init程式碼(如下所示),本來是在static.cpp程式碼中呼叫的,這裡由於不想在加一個原始檔,就直接在這裡呼叫了。
    android::initialize_string8();
    android::initialize_string16();

    android::terminate_string16();
    android::terminate_string8();
下面可以看到,在類的建構函式和解構函式中,呼叫了相應的初始化函式和終結函式。而在類宣告的下方就定義了LibUtilsFirstStatics 物件gFirstStatics
該物件其它檔案中也沒呼叫,也許就是為了呼叫init函式和終結函式吧。
class LibUtilsFirstStatics
{
public:
    LibUtilsFirstStatics()
    {
        initialize_string8();
        initialize_string16();
    }
    
    ~LibUtilsFirstStatics()
    {
        terminate_string16();
        terminate_string8();
    }
};

static LibUtilsFirstStatics gFirstStatics;

五、除錯過程中遇到的問題

1) 在除錯過程,由於名稱空間的使用問題,導致一些方法找不到,編譯不過。解決辦法就是新增對應的名稱空間

2) 假如在類A中使用了類B,在沒有包含類B時,編譯時提示找不到類B相應的方法。解決辦法就是包含對應的類,如直接包含class String8; 結構體也可以這樣包含。

3) main函式不能包含在名稱空間中,要不然編譯會出問題的。