JNI其实是Java Native Interface的简称,也就是java本地接口。 Java是一种平台无关性的语言,平台对于上层的java代码来说是透明的,所以在多数时间我们是不需要JNI的,但本文在Qt开发过程中使用到JNI调用Android系统功能。
在“详解Qt开发中JNI调用Android系统功能(1)”中我们给出了一些简单的示例,演示了如何使用 Qt JNI 类库访问网络状态、系统资源目录、当前应用信息等等,这次呢,我们提供一些新的示例,这些示例可能更具实际意义。
本文的示例包括:
1.震动
2.让屏幕常亮
3.动态改变应用的显示方向(横屏、竖屏)
4.调节屏幕亮度
5.设置铃声模式
示例介绍
图1
我们按照界面上的顺序,一个一个来看这些功能如何实现。
源码分析
构建界面的代码在 Widget 类的构造函数里,不说了。这次我们换个搞法,不列所有代码了,一个功能一个功能分开说代码,这样文章看起来短一些。
震动
当你点击图1中的“Vibrate”按钮,onVibrate() 槽会被调用,它的代码如下:
看着是不是很熟悉呢?其实使用 QAndroidJniObject 来调用 Java 类库,写出来的代码看起来都差不多……你翻翻“QtAndroid详解(3):startActivity实战Android拍照功能”和“QtAndroid详解(4):JNI调用Android系统功能(1)”里面的代码就会更确认这一点。其实这里面体现的是QAndroidJniObject的一般用法。
Android 里的很多系统服务都有一个名字,以静态成员变量的形式定义在 Context 类中。之前也见识过了。震动器的名字是 Context.VIBRATOR_SERVICE ,对应的类为 android.os.Vibrator。Vibrator 的方法 “void vibrate(long ms)” ,可以产生震动,参数单位是毫秒。
我们 C++ 代码,先使用 QAndroidJniObjec