按照 GNOME 官方的说法,Gjs 是 GNOME 的 JavaScript 绑定,主要基于 Spider Monkey 这个 JavaScript 引擎与 GObject Introspection [ 1] 实现。本文简单介绍一下 Gjs 的用法,之所以是简单介绍,是因为我对 JavaScript 不太熟悉。

Gjs 解析器

Gjs 解析器基于 Spider Monkey 实现,后者是 Firefox 的 JavaScript 引擎。如果系统中已安装了 gjs,那么在终端中执行:

?
1
$ gjs

便可运行 gjs 解析器,然后我在其中输入了我的第一个 Hello world 程序:

?
1
2
gjs> print ("hello world");
hello world

可以将 "print ("hello world");" 字符串保存到 hello-world.js 文件中,然后在终端中执行:

?
1
$ gjs hello-world.js

这样便可执行一个独立的 JavaScript 脚本程序了。

导入 GNOME 模块

gjs 提供了 imports.gi 对象,使用它可以导入被 GObject Introspection(GI)认可的 typelib 二进制文件所关联的 GNOME 模块对应的 JavaScript 对象,然后 gjs 便可以访问底层基于 GObject 库实现的 C 程序库。看下面的示例:

?
1
2
3
const GLib = imports.gi.GLib;
print (GLib.get_home_dir ());

当使用 gjs 执行这个脚本程序时,便会在终端中输出 $HOME 的值。

如何知道哪些 GNOME 库已被 GI 化

现在,GNOME 桌面的大部分程序库皆已 GI 化,通常可在 /usr/lib/girepository-1.0 目录中看到它们,只要在该目录中的出现的 typelib 文件,其对应的库便可在 gjs 通过 imports.gi 对象进行连接。再举个导入 Clutter 库的例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
const Clutter = imports.gi.Clutter;
Clutter.init (null,null);
let stage = Clutter.Stage.get_default ();
stage.title ="Test";
stage.set_color(newClutter.Color({red:150, blue:0, green:0, alpha:255}));
stage.show ();
Clutter.main ();
stage.destroy ();

如何使用被 GI 化的 GNOME 库函数

上面那个导入 Clutter 库的示例中,出现了许多 Clutter 库函数的 JavaScript 版本,它们对应的 C 函数原型信息可从  /usr/share/gir-1.0 目录中的 gir 文件中查到。例如 Clutter.init() 函数在 Clutter-1.0.gir 文件中对应的信息如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<functionname="init"c:identifier="clutter_init">
  <docxml:whitespace="preserve">...clutter_init 函数的描述信息...</doc>
  <return-valuetransfer-ownership="none">
    <docxml:whitespace="preserve">a #ClutterInitError value</doc>
    <typename="InitError"c:type="ClutterInitError"/>
  </return-value>
  <parameters>
    <parametername="argc"
               direction="inout"
               caller-allocates="0"
               transfer-ownership="full">
      <docxml:whitespace="preserve">The number of arguments in @argv</doc>
      <typename="gint"c:type="int*"/>
    </parameter>
    <parametername="argv"
               direction="inout"
               caller-allocates="0"
               transfer-ownership="full"
               allow-none="1">
      <docxml:whitespace="preserve">A pointer to an array of arguments.</doc>
      <arraylength="0"zero-terminated="0"c:type="char***">
        <typename="utf8"c:type="char**"/>
      </array>
    </parameter>
  </parameters>
</function>

不知道 GNOME 开发者以后会不会为 gir 文件提供一个浏览器。现在如果使用 gjs 的话,只好自己去读这样的 xml 文件或者自行去解析。

剩下的事情

上述只是简略介绍一下 gjs 的基本用法。如果真的打算使用 gjs 来写 GNOME 3 桌面程序的话,那么不仅要熟悉 javascript,还要能够读懂 devhelp 中 glib, gtk+, clutter 等 C 库的文档

摘自

->> http://garfileo.is-programmer.com/posts/29644.html

Gjs编程及调用底层库原理相关推荐

  1. Java并发编程-线程池底层工作原理

    线程池底层工作原理 1.线程池的底层工作流程 1.1.线程池的底层工作原理图 1.2.银行办理业务案例 1.3.线程池的底层工作流程总结 2.线程池用哪个?生产中如何设置合理参数 2.1.在工作中单一 ...

  2. 使用SWIG,在java编程中调用动态库

    1. SWIG是什么? SWIG的官方网站是 http://www.swig.org/ . 官方网站第一句话:SWIG is a software development tool that conn ...

  3. java虚拟机线程调优与底层原理分析_Java并发编程——多线程的底层原理

    " Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和 CPU的 ...

  4. 两台电脑串口传输文件及调用opencv库编程显示图片和文本

    文章目录 一.两台电脑利用串口进行文件传输 (一).实验内容 (二).配置环境 (三).实验过程 (四).结果分析 二.在Ubuntu下基于Linux环境调用opencv库编程显示图片和文本 (一). ...

  5. 在Ubuntu下用C/C++(或python)调用opencv库编程显示一张图片并在上面加文字

    一.实验内容 调用opencv库编程显示一张图片,并打开一个名为"logo.txt"的文本文件(其中只有一行文本文件,包括你自己的名字和学号),按照名字和学号去读取汉字24*24点 ...

  6. 徐无忌并发编程笔记:无锁机制CAS及其底层实现原理?

    徐无忌并发编程笔记:无锁机制CAS及其底层实现原理? 完成:第一遍 1.什么是CAS算法? compare and swap:比较与交换,是一种有名的无锁算法 CAS带来了一种无锁解决线程同步,冲突问 ...

  7. RC4(原理+代码+调用openssl库+报错分析)

    目录 一.原理 1.流密码的基本思想 2.RC4流密码算法的原理 1.初始化数据表S和T 2.初始置换数据表S(密钥调度算法) 3.生成密钥流(伪随机数生成算法) 二.代码实现 三.调用openssl ...

  8. 【dubbo源码解析】--- dubbo中Invoker嵌套调用底层原理

    本文对应源码地址:https://github.com/nieandsun/dubbo-study 文章目录 1 dubbo中Invoker的重要性 2 dubbo RPC链条中代理对象的底层逻辑 2 ...

  9. 《Java并发编程的艺术》一一第2章Java并发机制的底层实现原理

    第2章Java并发机制的底层实现原理 2.1 volatile的应用 Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行, ...

  10. 《Java并发编程的艺术》:第2章 Java并发机制的底层实现原理

    前言 Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节 码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和 CPU的指令. ...

最新文章

  1. CentOS 7下使用Gitolite搭建Git私服
  2. join left 大数据_Java并发编程笔记-JDK内置并行执行框架Fork/Join
  3. android键盘ui,android – 在自定义键盘中重新调整候选视图的UI
  4. 采用CreateThread()创建多线程程序
  5. Bootstrap全局css样式_图片,响应式工具
  6. 5-13自定义sink到MySQL.
  7. 你们网贷逾期最长多少时间,你们怎么处理的
  8. SpringBoot 集成log4j2
  9. 111. Minimum Depth of Binary Tree
  10. 【APIcould】连接手机,通过APPLoader在手机上实时展示项目效果
  11. Java 方法的重载与重写
  12. QEMU模拟mini2440开发环境
  13. 汉字在c语言中用什么表示,在C语言中显示汉字
  14. 渗透基础学习-信息搜集
  15. exoplay切换全屏_02.视频播放器整体结构
  16. CAD小问题解决办法1
  17. SQLServer查看服务器版本和服务器名称
  18. 打印10以内的加减法
  19. PE文件-CPU寄存器-栈-常用汇编语言指令-push-move-sub-lea-rep-xor
  20. idea crlf是什么意思

热门文章

  1. 用shell脚本在consul注册exporter服务
  2. 高端游戏计算机电源外形规格,游戏新高度!实述高端电源选购技巧
  3. 软件工程师考试(高级)大纲
  4. 面试备战笔记2019
  5. 西电计算机学院硕士生导师马,西安电子科技大学计算机学院研究生导师简介-周端...
  6. 【vmware】vmware tools 地址
  7. 计算机分屏解决方案,电脑一机多屏显示解决方案
  8. 幼儿园清明节活动设计方案
  9. OpenCV4--->基础函数,与操作
  10. macbook linux 双系统,mac上安装ubuntu双系统教程