libacc : Android 2.0 內建的輕量級 C Compiler

简介: Android 2.0 (Eclair) 原始程式碼已於一個月前釋出,在目錄 system/core 下有個 libacc 的子項目,這是開發者修改自 Fabrice Bellard 的大作 OTCC (Obfuscated Tiny C Compiler),以 C++ 與 Android 的執行時期函式庫重寫。

Android 2.0 (Eclair) 原始程式碼已於一個月前釋出,在目錄 system/core 下有個 libacc 的子項目,這是開發者修改自 Fabrice Bellard 的大作 OTCC (Obfuscated Tiny C Compiler),以 C++ 與 Android 的執行時期函式庫重寫。libacc 的功能是提供給 Android 2.0 的 RenderScript 一個 C-like 語法的描述,如此一來,開發者可撰寫高效能的視覺效果與動畫,不過這部份並未完成,詳情可參考 "Android renderscript, more info' and an example application" 一文。
關於 libacc 的整合部份,可參考 frameworks/base/libs/rs 目錄下的兩個檔案:

    * rsScriptC.cpp
    * rsScriptC_Lib.cpp

筆者準備了一份可單獨執行於 GNU/Linux 環境的套件:"libacc.tar.bz2",除去 Android 的相依性並補上 Makefile,測試方式如下:
    libacc$ make
    g++ -I./include -DHAVE_PTHREADS -c acc.cpp
    gcc -I./include -DHAVE_PTHREADS -c hashmap.c
    gcc -I./include -DHAVE_PTHREADS -c logd_write.c
    g++ -I./include -DHAVE_PTHREADS -c tests/main.cpp
    g++ -I./include -DHAVE_PTHREADS -c tests/runtimeTest.cpp
    g++ -o main \
      acc.o \
      hashmap.o \
      logd_write.o \
      main.o \
      -ldl
    g++ -o runtimeTest \
      acc.o \
      hashmap.o \
      logd_write.o \
      runtimeTest.o \
      -ldl

libacc 的 Code generator 支援以下硬體架構:
    * x86 / IA32
    * x86_64
    * ARMv5

以 IA32 的環境為例,可透過測試程式來驗證 libacc: (參數 -R 表示作執行的動作)
    libacc$ ./main -R tests/data/hello.c
    Executing compiled code:
    Hello, world
    result: 0


其中 tests/data/hello.c 的內容為:
    libacc$ cat tests/data/hello.c
    int main() {
    printf("Hello, world\n");
    return 0;
    }


若平台是 ARM 的話,還可以支援反組譯輸出,libacc 是 RenderScript 背後很重要的基礎建設,允許動態編譯 Android Graphics 的 RenderScript,輸出成機械碼並執行。參考檔案 tests/runtimeTest.cpp 可得知 RenderScript 的寫法,整個 libacc 可內嵌於程式中,比方說:
    const char* text = "void op_int(int a);\n"
       "void op_float12(float a, float b, float c, float d,\n"                   
       "           float e, float f, float g, float h,\n"
       "           float i, float j, float k, float l);\n"
       "void script() {\n"
       "  globalVar += 3;\n"
       "  op_int(123);\n"
       "  op_float12(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0);\n"
       "}\n";

這個字串經過 libacc 的函式呼叫後,可得到以下的編譯與執行結果:
    libacc$ ./runtimeTest
    Executing script:
    op_int(123)
    op_float12(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)
    After script globalVar = 20


目錄 tests 還包含可在 Android 環境執行的自動測試 Python script。
目录
相关文章
|
7月前
|
编解码 物联网 开发工具
Android平台内网RTSP网关和轻量级RTSP服务的区别和联系
我们在对接轻量级RTSP服务的时候,遇到客户这样的使用场景:客户是用于车载自组网环境,确保多辆车之间可以相互看到对方的实时视频,以期可以了解到前方路况等关注的信息。
102 0
|
7月前
|
编解码 监控 开发工具
如何同时启动Android平台GB28181设备接入模块和轻量级RTSP服务模块?
为什么要设计GB28181设备接入模块?GB28181接入SDK,实现不具备国标音视频能力的 Android终端,通过平台注册接入到现有的GB/T28181—2016服务,可用于如智能监控、智慧零售、智慧教育、远程办公、生产运输、智慧交通、车载或执法记录仪等场景。Android终端除支持常规的音视频数据接入外,还可以支持移动设备位置(MobilePosition)订阅和通知、语音广播和语音对讲、云台控制和预置位查询等。
|
7月前
|
编解码 开发工具 Android开发
Android平台RTSP轻量级服务|RTMP推送摄像头或屏幕之音频接口设计
好多开发者在做Android平台录像或者RTSP轻量级服务、RTMP推送相关模块时,对需要设计哪些常用接口会心存疑惑,本文主要以大牛直播SDK(官方)为例,简单介绍下Android平台直播推送SDK所有音频相关的接口,感兴趣的开发者可以看看。
|
7月前
|
编解码 开发工具 Android开发
Android平台如何实现外部RTSP|RTMP流注入轻量级RTSP服务模块(内网RTSP网关)
今天分享的是外部RTSP或RTMP流,拉取后注入到本地轻量级RTSP服务模块,供内网小并发场景下使用,这里我们叫做内网RTSP网关模块。
|
3月前
|
开发工具 Android开发
Android平台RTMP推送|轻量级RTSP服务|GB28181设备接入模块之实时快照保存JPG还是PNG?
Android平台RTMP推送|轻量级RTSP服务|GB28181设备接入模块之实时快照保存JPG还是PNG?
|
3月前
|
数据采集 编解码 图形学
Android平台Unity下如何通过WebCamTexture采集摄像头数据并推送至RTMP服务器或轻量级RTSP服务
Android平台Unity下如何通过WebCamTexture采集摄像头数据并推送至RTMP服务器或轻量级RTSP服务
107 0
|
7月前
|
开发工具 Android开发 开发者
Android平台轻量级RTSP服务模块如何实现一个服务发布多路RTSP流?
Android平台轻量级RTSP服务模块如何实现一个服务发布多路RTSP流?
237 0
|
7月前
|
数据处理 Android开发 开发者
Android平台实现mp4文件实时推送RTMP|轻量级RTSP服务|GB28181平台
好多开发者有这样的诉求,想把本地录制的MP4文件,以实时流数据的形式,推送到RTMP服务器,注入轻量级RTSP服务,或者对接到GB28181平台,这块前几年我们就有对接。
|
7月前
|
编解码 开发工具 Android开发
如何在Android端实现轻量级RTSP服务(类似于IPC)
首先声明一点,本blog提到的轻量级RTSP服务,类似于网络摄像头(IPC),而非传统意义的接受外部推流的RTSP服务器。
464 0
|
7月前
|
开发工具 Android开发 开发者
Android平台RTMP推流或轻量级RTSP服务(摄像头或同屏)编码前数据接入类型总结
很多开发者在做Android平台RTMP推流或轻量级RTSP服务(摄像头或同屏)时,总感觉接口不够用,以大牛直播SDK为例 (Github) 我们来总结下,我们常规需要支持的编码前音视频数据有哪些类型: