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打进固件里。

罗嗦完毕!!!!!!!!!!!!!!!!

ANDROID 开机启动VNC SERVER的更多相关文章

  1. android开机启动流程说明

    android开机启动流程说明 第一步:启动linux 1.Bootloader 2.Kernel 第二步android系统启动:入口为init.rc(system\core\rootdir) 1./ ...

  2. Android开机启动Activity或者Service方法

    本文出自 “Bill_Hoo专栏” 博客,请务必保留此出处http://billhoo.blog.51cto.com/2337751/761230 这段时间在做Android的基础开发,现在有一需求是 ...

  3. Android开机启动Activity或者Service方法(转载)

    这段时间在做Android的基础开发,现在有一需求是开机启动,按照网上某些博文教程做了下,始终不成功,一开机总是提示所启动的应用程序意外终止,于是参考了Android SDK doc,终于解决问题,下 ...

  4. Xvfb新建虚拟X窗口,通过x11vnc启动VNC Server并转发Xvfb启动的虚拟窗口

    远程运行Linux窗口程序使用X Windows太重量级了,可以使用Xvfb新建虚拟X窗口,通过x11vnc启动VNC Server并转发Xvfb启动的虚拟窗口. 1 2 3 4 5 6 7 8 yu ...

  5. Android开机启动程序

    android程序实现开机启动的原理,简单点说就是做一个广播接收器,接收到开机广播时就启动activity或service或执行其它操作.Android系统在启动的时候会发出一个开机广播,内容为ACT ...

  6. Android 开机启动

    创建一个Receiver,用来监听开机完毕: public class MyReceiver extends BroadcastReceiver { static final String actio ...

  7. Android 开机启动通知

    效果图: 学习: 1.静态注册实现开机启动 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLET ...

  8. android开机启动应用和服务

    注冊广播监听开机状态.启动应用和服务等: 监听开机的广播接收器: public class BootCompletedReceiver extends BroadcastReceiver{ @Over ...

  9. android开机启动过程

    Android系统开机主要经历三个阶段: bootloader启动 Linux启动 Android启动 启动文件: 对于机器从通电到加载Linux系统一般需要三个文件:bootloader(引导文件) ...

随机推荐

  1. iOS开发之MD5封装及应用

    一.MD5的封装 #define CC_MD5_DIGEST_LENGTH 16 - (NSString *)toMD5 { const char* input = [self UTF8String] ...

  2. Oracle主键约束、唯一键约束、唯一索引的区别

    一般,我们看到术语“索引”和“键”交换使用,但实际上这两个是不同的.索引是存储在数据库中的一个物理结构,键纯粹是一个逻辑概念.键代表创建来实施业务规则的完整性约束.索引和键的混淆通常是由于数据库使用索 ...

  3. 使用PHPExcel报错 Fatal error: Class 'ZipArchive' not found

    Windows PHP5+Apache2.2 解决方法: 打开php.ini 找到: extension=php_xsl.dllextension=php_zip.dll 将其前面的';'去掉. 找到 ...

  4. LeetCode_Unique Binary Search Trees

    Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...

  5. 【转】ubuntu下解压缩zip,tar,tar.gz和tar.bz2文件

    原文网址:http://blog.sina.com.cn/s/blog_5da93c8f0101h1uj.html 在Linux下面如何去压缩文件或者目录呢? 在这里我们将学习zip, tar, ta ...

  6. 【CF689D Friends and Subsequences】二分搜索,区间查询

    题意:给定两个整数序列a,b,将a,b对齐,问有多少个区间满足a的区间内最大值等于b的区间内最小值. 数据范围:区间长度n属于[1, 200000],序列中的元素在整型范围内 思路:枚举所有n*(n+ ...

  7. android中的本地定时推送到通知栏

    一.使用系统定义的Notification 以下是使用示例代码: import android.app.Notification; import android.app.NotificationMan ...

  8. 动态规划之最长公共子序列LCS(Longest Common Subsequence)

    一.问题描述 由于最长公共子序列LCS是一个比较经典的问题,主要是采用动态规划(DP)算法去实现,理论方面的讲述也非常详尽,本文重点是程序的实现部分,所以理论方面的解释主要看这篇博客:http://b ...

  9. 迭代 Iterate

    迭代:指按照某种顺序逐个访问列表中的每一项.比如:for语句 逐个访问: lst = ['q', 'i', 'w', 's', 'i', 'r'] for i in lst: print (i), # ...

  10. [HDU 1317]XYZZY[SPFA变形][最长路]

    题意: 一个图, 点权代表走到该点可获得的能量值. 可正可负. 一个人从1 号出发,带有100点能量. 问是否有一种方案可使人在能量值>0的时候走到n. 思路: 这个题首先要注意点权. 其实就是 ...