android底層庫libutils之string8,string16研究
阿新 • • 發佈:2019-01-10
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函式和終結函式吧。
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
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函式不能包含在名稱空間中,要不然編譯會出問題的。