Android下C++代碼調用匯編函數

參考鏈接:

http://www.rosoo.net/a/201201/15603.html

http://www.eggwall.com/2011/09/android-arm-assembly-calling-assembly.html

文摘:

arm和thumb的區別:

在一般的情況下,Thumb指令與ARM指令的時間效率和空間效率關係爲: - Thumb代碼所需的存儲空間約爲ARM代碼的60%~70% - Thumb代碼使用的指令數比ARM代碼多約30%~40% - 若使用32位的存儲器,ARM代碼比Thumb代碼快約40% - 若使用16位的存儲器,Thumb代碼比ARM代碼快約40%~50% - 與ARM代碼相比較,使用Thumb代碼,存儲器的功耗會降低約30%顯然,ARM指令集和Thumb指令集各有其優點,若對系統的性能有較高要求,應使用32位的存儲系統和ARM指令集,若對系統的成本及功耗有較高要求,則應使用16位的存儲系統和Thumb指令集。當然,若兩者結合使用,充分發揮其各自的優點,會取得更好的效果。

 斬亂麻  15:33:32 ARM指令集是32位的thumb是16位的,是精簡ARM指令集,主要用於內存非常緊張的地方。


按照上面的添加,但遇到鏈接錯誤,還是那個親切熟悉的undefined resolved refernce......錯誤啊~

其實已經可以總結:但凡鏈接文件沒有找到函數這樣的錯誤多半都是c與c++之間函數名的查找不同,c++調用匯編的時候問題也是一樣的。

解決方法自然也一樣啦: 在函數聲明前添加extern "C"

具體如下:

1.編寫好彙編文件:myasm.S

大概如下:

    .text
    .align 4
    .arm
    .global myasmfunction
    .type myasmfunction, %function

#define SRC_BUFF    r0
#define DST_BUFF    r3

myasmfunction:
    push    {r4-r6, lr}
    mov     DST_BUFF, SRC_BUFF



2.在C++源文件MyCall.cpp中調用上述函數:

extern "C" void myasmfunction(int value);

namespace android {

void MyCall::test()

{

        ......

    myasmfunction(1);

        ......

}



3.在Android.mk中添加上述彙編源文件:

 

   ......

LOCAL_SRC_FILES := MyCall.cpp myasm.S

LOCAL_ARM_MODE := arm

    ......


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章