如何在Ubuntu手机click包中打入第三方应用库

由于Ubuntu手机平台安全的限制,在Ubuntu手机的应用中我们只能访问自己的空间.如果我们所需要访问的文件不存在于我们应用所在的空间,我们是没有办法访问到的.我们的应用只能访问系统提供的库.如果系统没有所需要的库的话,我们通过可以通过如下的方法实现:

  1. 在我的应用中把应用的所需要的第三方的源码放入到我的应用项目中,并形成plugin(通常是C++代码)从而被应用调用
  2. 在我们的应用中把第三方的库打包进我们的应用包中,并在我的plugin(通常是C++代码)中调用,进而被应用调用

我们可以选择Ubuntu SDK所提供的标准的带有C++ plugin的模版来实现.对于第二种情况,我们同样需要在我们的项目中加入所需要的文件,并打包到我们的应用中去.第二种方法对于一些不存在于Ubuntu SDK所提供的标准库里的情况是非常有用的.比如我们可以得到PDF reader的库的源码,并编译成为我们自己的库.最终我们可以把这些库一起打包并安装到我们的手机中使用.

在今天的这篇文章中,我们就第二种方法来详细介绍.

1)创建一个最小的shared库

我已经创建好了一个最基本的shared库.开发者可以通过如下的方式来下载我们的代码:

$ git clone https://github.com/liu-xiao-guo/studentlib_shared

我们的这个库非常地简单:

Student.h

#include<string>

class Student{
private:
	std::string name;
public:
	Student(std::string);
	virtual void display();
};

student.cpp

#include <iostream>
#include "Student.h"
using namespace std;

Student::Student(string name):name(name){}

void Student::display(){
	cout << "A student with name " << this->name << endl;
}

接下来,我们以armhf chroot为例,当然我们也可以对i386使用同样的方法.我们通过我们已经安装好的armhf chroot来编译我们的这个库.首先我们通过如下的方式进入到我的chroot:

$ click chroot -aarmhf -fubuntu-sdk-15.04 run  

当我们进入到我买的chroot中后,我们就可以开始编译我们的应用库了.我们进入到我们的项目的根目录中,并打入如下的命令

$ mkdir build
$ cd build
$ cmake ..
$ make

这样在我们的build子目录下就可以看到我们希望的库了.

 

(click-ubuntu-sdk-15.04-armhf)[email protected]:~/qml/studentlib_shared/build$ ls
CMakeCache.txt  CMakeFiles  Makefile  cmake_install.cmake  libtestStudent.so
(click-ubuntu-sdk-15.04-armhf)[email protected]:~/qml/studentlib_shared/build$

2)创建一个带有plugin的最基本的应用.

我们选择"QML App with C++ plugin (qmake)"模版来创建一个最基本的testplugin应用.在这个应用中,我们将展示如何使用我们上面已经创建好的shared库.

接下来,我们修改我们的mytype.cpp及mytype.h文件:

mytype.h

#ifndef MYTYPE_H
#define MYTYPE_H

#include <QObject>

class MyType : public QObject
{
    Q_OBJECT
    Q_PROPERTY( QString helloWorld READ helloWorld WRITE setHelloWorld NOTIFY helloWorldChanged )

public:
    explicit MyType(QObject *parent = 0);
    Q_INVOKABLE void testlib();
    ~MyType();

Q_SIGNALS:
    void helloWorldChanged();

protected:
    QString helloWorld() { return m_message; }
    void setHelloWorld(QString msg) { m_message = msg; Q_EMIT helloWorldChanged(); }

    QString m_message;
};

#endif // MYTYPE_H

mytype.cpp

#include "mytype.h"
#include "Student.h"

MyType::MyType(QObject *parent) :
    QObject(parent),
    m_message("")
{

}

void MyType::testlib()
{
     Student student("johnddfsfdfdfds");
     student.display();
}

MyType::~MyType() {

}

在上面的代码中,我们已经使用了我们shared库中的display()方法.如果这个时候我们去运行我们的应用的话,我们会发现我们的应用肯定是有错误的.这是因为它根本找不到它所需要的库.在下面我们来尝试把我们的库打包到我们的项目中来.

我们首先在我们的项目中创建一个叫做libs的目录,并把我们的shared库考入到这个目录中.这样整个的项目的目录就像:

[email protected]:~/qml/testplugin$ tree -L 3
.
├── backend
│   ├── Testplugin
│   │   ├── backend.cpp
│   │   ├── backend.h
│   │   ├── mytype.cpp
│   │   ├── mytype.h
│   │   ├── qmldir
│   │   └── Testplugin.pro
│   └── tests
│       └── unit
├── libs
│   ├── libs.pro
│   ├── libtestStudent.so
│   └── Student.h
├── manifest.json.in
├── po
│   └── testplugin.liu-xiao-guo.pot
├── testplugin
│   ├── Main.qml
│   ├── testplugin.apparmor
│   ├── testplugin.desktop
│   ├── testplugin.png
│   ├── testplugin.pro
│   └── tests
│       ├── autopilot
│       └── unit
├── testplugin.pro
└── testplugin.pro.user

在上面的显示中,我们可以看到在libs目录中除了一个我们看到的那个libtestStudent.so及header文件外,还有一个叫做libs.pro的文件.它的内容如下:

libs.pro

TEMPLATE = lib

load(ubuntu-click)

filetypes = qml png svg js qmltheme jpg qmlproject desktop wav so

OTHER_FILES = filetypes

for(filetype, filetypes) {
  OTHER_FILES += *.$$filetype
}

other_files.path = $${UBUNTU_CLICK_PLUGIN_PATH}
other_files.files = $$OTHER_FILES

INSTALLS += other_files

message(The project1 will be installed in $${UBUNTU_CLICK_PLUGIN_PATH})

在上面的文件中,我们可以通过上面的方法把我们需要的.so文件拷入到我们所需要的目录中.

最后在我们的"testplugin.pro"文件中需要加入我们的目录"libs".

SUBDIRS += testplugin            backend/Testplugin            libs

在我们的"TestPlugin.pro"中,我们需要加入如下的句子:

LIBS += -L$$PWD/../../libs/ -ltestStudent
INCLUDEPATH += $$PWD/../../libs
DEPENDPATH += $$PWD/../../libs

在我们的QML文件中,我们是这样来调用的:

Main.qml

        ...
        Button {
            anchors.centerIn: parent
            text: "Test lib"

            onClicked: {
                myType.testlib();
            }
        }
        ...

最终,我们来编译并部署我们的应用到我们的手机上:

我们可以查看在我们手机中的安装文件.在我们的desktop中打入如下的命令:

$ adb shell

通过上面的命令进入到手机中,并进入到如下的目录:

/opt/click.ubuntu.com/testplugin.liu-xiao-guo/current/lib/arm-linux-gnueabihf/

我们可以看到我们所需要的文件已经被成功安装到该目录中:

当我们点击在应用中的按钮"Test lib"时,我们可以在我们的SDK IDE中看见输出:

上面输出的字符串就是我们利用我们的库来输出的:

     Student student("johnddfsfdfdfds");
     student.display();

整个项目的源码在https://github.com/liu-xiao-guo/testplugin

时间: 2024-11-08 01:40:55

如何在Ubuntu手机click包中打入第三方应用库的相关文章

CocoaPods:管理Objective-c 程序中各种第三方开源库关联

在我们的iOS程序中,经常会用到多个第三方的开源库,通常做法是去下载最新版本的开源库,然后拖拽到工程中. 但是,第三方开源库的数量一旦比较多,版本的管理就非常的麻烦.有没有什么办法可以简化对第三方库的管理呢?有!在使用SDWebImage这个第三方库的时候,我在学习如何将进度展现时,看到有人提到用CocoaPods(http://cocoapods.org/,需FQ) 来管理第三方开源库. CocoaPods是管理Objective-c 程序中各种第三方开源库关联非常棒的方式,只要安裝好 Coc

如何在Ubuntu手机应用中得到所有的环境变量值

我们在先前的例程中已经通过一些方法得到我们应用的一些环境变量值.这些值有的非常有用,比如我们可以得到我们应用所只能访问的目录.在今天的例程中,我们来展示一种方法可以得到应用所有的环境变量.在我们的实际应用中,我们可以通过这些环境变量来做一些事情.另外,在这个例程中,我们也展示了如何在Qt C++的代码中构造我们的ListView中的model.我们在先前的例程"Ubuntu OS应用Runtime Enviroment"已经展示了和我们平台安全相关的一些环境变量. 首先,我们来展示我们

如何在Ubuntu手机中使用前置照相机

我们可以在Ubuntu QML的API文档中看到Camera的用法,但是里面没有写到任何的前置Camera的调用方法.对于一些应用来说,前置Camera的使用是重要的.我们必须使用Qt C++代码来实现这个功能.在这篇文章中,我们来介绍如何使用Ubuntu手机中的前置照相机. 1)创建一个最基本的QML应用         这样我们就生成了一个含有plugin的项目. 2)在项目中加入CameraSelector来选择照相机 为了能够调用Camera的一些API,我们在plugin中加入如下的C

如何在Ubuntu手机上实现一个FileDialog

前一段时间,有个开发者问我能否在Ubuntu手机中使用QtQuick.Dialogs来实现FileDialog.目前在手机上没有Qt这个库的实现.最主要的原因是它不使用unit grid的方式来布局,所以在真的手机上显得非常小.那么我们怎么才能实现同样的功能呢? 我们首先来查看一下我们的Ubuntu Qt所提供的API Dialog.这里我们有提供一个Dialog的control.我们可以仿照上面的例程来写出我们所需要的例程.另外,我们也需要使用另外一个APIFolderListModel.通过

如何在 Ubuntu 15.04 系统中安装 Logwatch

大家好,今天我们会讲述在 Ubuntu 15.04 操作系统上如何安装 Logwatch 软件,它也可以在各种 Linux 系统和类 Unix 系统上安装.Logwatch 是一款可定制的日志分析和日志监控报告生成系统,它可以根据一段时间的日志文件生成您所希望关注的详细报告.它具有易安装.易配置.可审查等特性,同时对其提供的数据的安全性上也有一些保障措施.Logwatch 会扫描重要的操作系统组件像 SSH.网站服务等的日志文件,然后生成用户所关心的有价值的条目汇总报告. 预安装设置 我们会使用

如何在Ubuntu手机中使得一个应用是全屏的应用

我们知道很多的开发者想把自己的应用设置为全屏的应用,这样可以使得应用能更多地占用屏幕的有效面积以使得自己的应用更好看.在默认的SDK的样板中,在应用的最上面,有一个"title"的地方占用很多的空间.对于一些应用来说,在主界面中,这个可能并不有用,但是对于使用PageStack的应用来说,这个区域显示一个向左的箭头以返回上一个页面的. 最近我也有这样的问题,我既想使用PageStack给予我的方便,又想拥有全屏的功能.在这篇文章中,我们来介绍如何做到全屏的应用.另外我们值得指出的是:我

如何在Ubuntu手机中监测网络的连接信息

我们知道对于很多的网路应用来说,网路的连接信息对于我们来说非常重要.我们有必要对网路的连接信息进行监测.一旦网路连接断开,我们需要提醒用户或做一些处理.在Ubuntu平台上,我们可以使用connectivity库来查看. 我们可以利用SDK的模版来创建一个最简单的QML应用.因为我们要使用connectivity,所以我们必须加入"connectivity"的security policy. 在我们的开发者网站上虽然也有NetworkStatus的介绍,但是可能并不是很全,我们可以使用

如何在Ubuntu 12.04 Server 中安装图形用户界面

使用ubuntu server安装lamp主机非常的方便,只要在安装系统的步骤中选择就是了 .但是很多时候我需要在图形界面下管理主机更加方便.今天的教程就是教大家安装图形界面. 首先你需要确定你的源文件中 /etc/apt/sources.list 已经使用Universe和Multiverse库.然后使用下面的命令来进行更新源列表和安装图形桌面. sudo apt-get update sudo apt-get upgrade sudo apt-get install ubuntu-deskt

在 Angular 2 Component 中使用第三方 JS 库

本文所有内容以 Angular 2 Quick Start 项目为基础,使用 TypeScript 语言. 如上图,最近遇到一个需求,需要在一个刚启动的 Angular 2 项目中使用 snap.svg 操作页面上的 svg 元素做动画. 我粗略的看了下, snap.svg 的实现似乎并没有遵从什么模块规范,就是常见的提供几个全局变量完事.如果真的耿直的在 Component 中去用的话,会在执行 tsc 编译成 js 文件这一过程中报错. 这是因为 TypeScript 编译器并不知道 sna