ANDROID 開機啟動VNC SERVER
背景信息:
最近在做一個項目,在項目需求中有這么一項“要把VNC SERVER 添加到android里並讓其開機自啟動”。其實做這個項目也挺縛手縛腳的,因為軟硬件技術都要去求人,所以就四處去找方案公司幫我們做這個項目,他們都不願意幫我們做,其原因之一就是上述所說的需求---VNC SERVER(我都把VNC源碼和參考資料都發給他們)。
我就想啦。。。真的有這么難么!!然后我就用我現有的資源(我公司自撐握的核心)通過網上查找資料和看書(艱苦的過程)去現實了這個讓別的方案公司聞風喪膽的ANDROID VNC SERVER。
具體步驟和所遇難題
1、 VNC源碼
https://github.com/oNaiPs/droid-VNC-server在這個網頁可以下載VNC SERVER 源碼
2、 VNC SERVER編譯
參考上述網頁(包含有VNC SERVER編譯方法)
The droid-VNC-server projects consists in three main modules parts: the daemon, wrapper libs and the GUI.
- Daemon -
Provides the vnc server functionality, injects input/touch events, clipboard management, etc
Available in jni/ folder
- Wrapper libs -
Compiled against the AOSP so everyone can build the daemon/GUI without having to fetch +2GB files.
Currently there are 2 wrappers, gralloc and flinger.
Available in nativeMethods/ folder, and precompiled libs in nativeMethods/lib/
- GUI -
GUI handles user-friendly control.
Connects to the daemon using local IPC.
-------------- Compile C daemon ---------------------
On project folder:
$ ndk-build
$ ./updateExecsAndLibs.sh
-------------- Compile Wrapper libs -----------------
$ cd <aosp_folder>
$ . build/envsetup.sh
$ lunch
$ ln -s <droid-vnc-folder>/nativeMethods/ external/
To build:
$ cd external/nativeMethods
$ mm .
$ cd <droid-vnc-folder>
$ ./updateExecsAndLibs.sh
-------------- Compile GUI------- -------------------
Import using eclipse as a regular Android project
3、 找NDK過程
在我ANDROID源碼的ndk/下執行ndk-build,發現編譯不過(估計是編譯不完全,缺少某些工具)搞了好久都沒有搞定。然后換一個思路,在網上找一個現成的NDK開發源碼。到網頁http://developer.android.com/tools/sdk/ndk/index.html下載android-ndk-r9b-linux-x86_64.tar.tar
4、 VNC 編譯中所遇到的難題
在VNC源碼目錄下執行上述所說的NDK源碼中的ndk-build,
出現上述錯誤,解決方法是:
修改報錯的文件/jni/jpeg/jidctfst.S文件。將里面出現的三個PLD行里的圓括號改成方括號。如下:
vnc server">
vnc server">
vnc server">
編譯完成后會在<vnc server>/libs/下生成ANDROID,MIPS,X86平台下的本地可執行文件androidvncserver(十分重要).
在VNC源碼目錄下執行./updateExecsAndLibs.sh
5、-------------- Compile Wrapper libs -----------------
$ cd <aosp_folder>(ANDROID源碼目錄)
$ . build/envsetup.sh
$ lunch
$ ln -s <droid-vnc-folder>/nativeMethods/ external/
$ cd external/nativeMethods
$ mm .
出現以下錯誤
其中有一個頭文件沒找到,又在網上找答案,找了好久都沒有找到,最后打開flinger.cpp一看,發現了條重要線索。如下:
包含的是ANDROID庫內的頭文件,並非自定義頭文件。最后在ANDROID源碼目錄下執行以下命令
find ./ -name ISurfaceComposer.h 得出以下結果
這么一看就知道結果同時也通過這一點讓我了解到了NDK開發的頭文件的路徑是<android source>/frameworks/native/include,原來ANDROID和VNC的頭文件的包含路徑不對應,修改VNC中的flinger.cpp文件改正如下
-----------------------------------------------------------
改正后再次編譯 mm .
會出現如下錯誤:
關於這個錯誤,估計是我的ANDROID源碼不能兼容,我的解決方法是:
1、 首先要找到這個結構體framebuffer_device_t在哪里,在ANDROID源碼目錄下執行以下命令:
grep -rn "framebuffer_device_t" ./ 得以下結果
framebuffer_device_t就在上圖所示的文件(<ANDROID>/hardware/libhardware/include/hardware/fb.h)中定義
2、 打開fb.h看這個結構體中的成員
其中有一個成員引起了我的高度注意,如下圖
再對照VNC源碼中的出錯的文件
其中的fbdev就是framebuffer_device_t型的結構體。
對照后發現VNC中的read和ANDROID源碼中的post函數參數和類型都一樣。
3、 把read 改成post.
最后再次編譯!OK!!
-----------------------------------------------------------
最后用ECLIPSE導入VNCSERVER工程生成APK(具體細節就不羅嗦啦)。
把VNC SERVER嵌入ANDROID
1、 把androidvncserver放到/system/bin/目錄下
2、 編輯init.rc文件,添加以下兩行
service androidvncserver /system/bin/androidvncserver
class main
也可以droidVNCserver.apk打進固件里。
羅嗦完畢!!!!!!!!!!!!!!!!