设计具有本机性能的跨平台Java UI:使用JNI来访问SLIK皮肤接口

简介:您能编写跨多种平台编译、同时执行速度仍然像本机代码一样快的 Java 代码吗?这是一个困扰 Java 开发人员的难题,对于具有复杂 UI 的应用 程序来说尤为如此。在本文中,开发人员 Vladimir Silva 建议了一种针对这个 难题的有趣解决方案。您将学习如何使用 JNI 来访问 SLIK,后者是一个跨平台 的 C API,它同时在 Windows 和 UNIX 上提供本机性能。

相对于诸如 C 和 C++ 这样的传统语言,Java 语言已主宰了中间层开发。 Java 语言在开发社区得到普遍接受的原因是它的面向对象设计、平台无关性, 以及丰富的支持 API。然而,它在设法将桌面作为一个真正的开发平台方面却很 失败——或许这是由于使得它主宰中间层的相同原因吧。平台无关性意味着相对 于本机 C 和 C++ 应用程序来说,性能会大大降低。

本文的目的是展示 Java 与简单皮肤接口(Simplistic Skin Interface,也 称为 SLIK)的绑定(请参阅 参考资料,获取更多细节)。SLIK 是一个可用于 构建跨平台 GUI 的 C API。通过使用 Java 本机接口(Java Native Interface ,JNI),您可以将 Java 代码绑定到 SLIK,从而设计出像 C 和 C++ 一样执行 的跨平台用户界面。

Java 语言和 C:动感二重唱

Java 技术支持与多种语言绑定,包括 C/C++、Fortran,等等。这一卓越特 性为开发人员带来了无比的灵活性,允许他们编写需要某些操作系统相关功能的 API。

为了证明 SLIK 的高级用户界面功能,我将展示如何构建一个没有矩形窗口 的 UI(也称为 皮肤或 带皮肤的窗口),它需要 Java 语言当前所没有提供的 低级 API。Java 所提供的是使用 JNI 访问任何操作系统相关服务的手段。在本 机端,C 是最佳的语言选择,而我将使用的 SLIK 的修改版本提供了实现本文目 标的多平台 C API。

关于 JNI 的详细介绍超出了本文的范围;欲了解关于该主题的更多信息,请 参考下面的 参考资料小节。务必要牢记的一件重要事情是,SLIK 是用 C 编写 的,并且您需要 JNI 来从用 Java 语言编写的代码中访问它。

SLIK 概述

SLIK 是一个 C API,用于构建基于 WinAmp 风格的皮肤的高级用户界面。此 类界面的例子包括像用于类 UNIX 系统的流行的 XMMS(X-Multimedia System, X-多媒体系统)和 XINE CD/DVD 播放器这样的音频和视频播放器。 使用这个 API 作为 GUI 的基础具有许多好处:

SLIK 包括一组增强的小部件,比如按钮、菜单、窗口、列表,以及当前的窗 口工具包所没有提供的高分辨率图像。

该 API 可用于多平台设计,因为它的核心库可同时在 Microsoft Windows 和类 UNIX 系统下编译。

SLIK 可以实现为一个 Windows DLL 或 UNIX 共享对象库,这意味着它可以 跨多个应用程序重用,并且易于维护。

SLIK 软件由 GQmpeg 小组在 GNU 公共许可证(GNU Public License,GPL) 之下提供。GQmpeg 小组提供的 SLIK 版本仅在类 UNIX 系统上作为可执行文件 来编译。我创建了一个修改后的版本,它可以同时工作在 Win32 和 UNIX 系统 上;这个版本以二进制的形式随本文的源代码一起提供(同时包括 Windows DLL 和 UNIX 共享对象或 SO 版本)。

我还同时提供了用于 UNIX 和 Windows 环境的 makefile。

时间: 2024-10-06 14:44:31

设计具有本机性能的跨平台Java UI:使用JNI来访问SLIK皮肤接口的相关文章

《Android的设计与实现:卷I》——第2章2.4 在Java中调用JNI实现方法

2.4 在Java中调用JNI实现方法 本节介绍如何在Java中调用JNI实现方法.JNI数据类型转换.JNI方法命名规则,以及JNI方法签名规则. 2.4.1 Java数据类型与JNI数据类型转换 Java中调用Native方法传递的参数是Java类型的,这些参数需要经过Dalvik虚拟机转化为JNI类型才能被JNI层识别.下面分基本类型和引用类型介绍这种转化关系. 1.基本类型转化关系 表2-1列出了基本类型的转化关系. 2.引用类型转化关系 JNI的引用类型定义了九种数组类型,以及jobj

java面向对象(三)之抽象类,接口

java类 java类分为普通类和抽象类,接口,上一节我大概讲了java类的一般格式,今天将抽象类和接口.同时讲一下它们是怎样存储的. 最重要的是理解为什么要有抽象和接口,这样学下来你猜不会迷茫,才能更好的去使用,所以多看看我写的关于抽象类和接口的目的. 抽象类 目的 为了对代码更好的维护和重用. 解析: 抽象类往往用来表征对问题领域进行分析.设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象. 1.因为抽象类不能实例化对象,所以必须要有子类来实现它之后才能使用.这样就可

jni-C语言通过JNI传出对象到Java层,如何实现使用统一对象接口传出?求大神支招

问题描述 C语言通过JNI传出对象到Java层,如何实现使用统一对象接口传出?求大神支招 小弟最近研究跨平台相关知识,android层调用JNI时,如何获取到底层C语言库传出的事件消息, 难点主要在于,事件消息为char数组,在C中可强转为指定结构体接收数据,但是要在android层接收这些数据并处理,应该怎样做才好, 求求各位大神给点思路... 解决方案 JNI中调用JAVA接口就可以

java 接口 接口实现-Java中一个类如何实现多个接口中同名同参返回值不同的方法?

问题描述 Java中一个类如何实现多个接口中同名同参返回值不同的方法? 如:` class A implements Interface1,Interface2{ //这里该怎么写呢? } interface Interface1{ public void method(); } interface Interface2{ public int method(); } 解决方案 class A implements Interface1,Interface2{ //直接写啊 public voi

web-inf-关于java web目录WEB-INF的访问问题

问题描述 关于java web目录WEB-INF的访问问题 可以实现从一个java web项目访问另一个java web项目里WEB-INF的资源吗 解决方案 普通JAVA获取WEB项目下的WEB-INF目录Java读取WEB-INF目录下的properties配置文件关于 无法访问WEB-INF下页面的问题的解决 解决方案二: 可以的.前提是有访问权限. 解决方案三: 可以,不过需要授权什么的

java-基于JAVA,身份证阅读器二次开发接口如何调用?

问题描述 基于JAVA,身份证阅读器二次开发接口如何调用? 身份证阅读器已经有了,我现在做了一个网站(JAVA语言开发的),网站后台需要调用身份证信息,录入身份证信息,如何调用这个身份证阅读器的二次开发接口?是身份证阅读器厂商提供二次开发接口吗?还是如何做?没有做过,不知如何下手...求大神帮忙!感激不尽!!!

在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口

 在上两篇文章中,我们介绍了如何为Android系统的硬件编写驱动程序,包括如何在Linux内核空间实现内核驱动程序和在用户空间实现硬件抽象层接口.实现这两者的目的是为了向更上一层提供硬件访问接口,即为Android的Application Frameworks层提供硬件服务.我们知道,Android系统的应用程序是用Java语言编写的,而硬件驱动程序是用C语言来实现的,那么,Java接口如何去访问C接口呢?众所周知,Java提供了JNI方法调用,同样,在Android系统中,Java应用程序通

跨站访问-ie启用XSS情况下java如何实现跨站点访问

问题描述 ie启用XSS情况下java如何实现跨站点访问 应用有访问外站地址,ie禁用XSS的情况下无法正常访问页面,现在不想通过修改ie的安全设置实现跨站点访问 ,有人说是通过 response.addHeader("X-XSS-Protection","0"); 可以实现ie禁用xss的功能,但在页面和过滤器都试过此代码,没有起作用,不知道还有什么办法 大概的操作是:点击菜单会访问action跳转到页面,在页面加载的时候执行:$(document).ready(

【IOS-COCOS2D-X 游戏开发之十三】详细讲解在XCODE中利用预编译并通过JNI调用ANDROID的JAVA层代码(COCOS2DX里访问调用ANDROID函数)!

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/725.html 很多看过之前Himi的[iOS-cocos2d-X 游戏开发之七]整合Cocos2dX的Android项目到Xcode项目中,Xcode编写&编译代码,Android导入打包运行即可! 博文的童鞋都在问我如何在Xcode中能调用Java的函数,比如在Android端需要加入广告.支付.等第三方平台或者