Jitsi(SIP communicator)创建自定义UI插件

袁建木
2023-12-01
  • 概述
             在进行二次开发,特别是开源项目的二次开发中,有那么几点我觉得是非常重要的,第一是在修改之前要先搞清楚这个开源项目如何进行部署、打包和测试,这些东西一般来说比较烦,容易产生问题,而国外开源软件的文档可能不是那么全面,环境和我们也可能不同(一般是linux环境居多);第二是在修改之前,先研究一下别人的源码,看看别人是不是给你提供了一些二次开发的接口,一般都会有一些plugins之类的,可以直接拿过来用;第三也是最重要的,如果不是特别需要,尽量不要直接修改别人的代码,也不要破坏别人的类结构(比如在别人的包下面加类),这样做,以后维护起来比较方便,而且我们也可以继续更新使用官方的新版本。
            在Jitsi这个项目的基础上进行二次开发,之前已经研究过它的编译打包,下面我们要研究一下它的架构,首先这个项目是一个基于OSGI的项目,OSGI的结构,简单来说就是一个OSGI加多个Bundle(也可翻译为模块或者插件),因此我们在这个架构上进行二次开发方向比较明确,就是进行OSGI的模块开发;然后我们研究一下源码发现它对于UI开发提供了一些容器和接口,可以方便我们进行GUI开发,并且给出了一个exampleplugin的Bundle,具体大家可以自行查看源码。
    • 创建包和类,配置OSGI环境
             在JItsi项目的源码目录下(src)添加包:test.plugin.employeebook包,在这个包下新建一个类:EmployeebookPluginActivator,如下
    public class EmployeebookPluginActivator implements BundleActivator{
    
    	@Override
    	public void start(BundleContext arg0) throws Exception {
    		// TODO Auto-generated method stub
    		
    	}
    
    	@Override
    	public void stop(BundleContext arg0) throws Exception {
    		// TODO Auto-generated method stub
    		
    	}
    	
    }
    
             在同样的包下新建一个名为employeebookplugin.manifest.mf的文件,内容如下:
    Bundle-Activator: test.plugin.employeebook.EmployeebookPluginActivator
    Bundle-Name: EmployeeBook plugin
    Bundle-Description: A plugin used to show employee book
    Bundle-Vendor: 
    Bundle-Version: 0.0.1
    Import-Package: org.osgi.framework
    
    
              修改项目根目录下的build.xml文件,添加一个ant target如下:
    	<target name="bundle-plugin-employeebook" depends="compile">
    	    <jar compress="false" destfile="${bundles.dest}/plugin-employeebook.jar"
    	            manifest="${src}/test/plugin/employeebook/employeebookplugin.manifest.mf">
    	            <zipfileset dir="${dest}/test/plugin/employeebook"
    	                prefix="test/plugin/employeebook" />
    	    </jar>
    	</target>
              然后运行这个target,完成后在项目根目录下的sc-bundles目录下出现plugin-employeebook.jar,然后修改lib目录下的felix.client.run.properties文件,设置felix框架自动加载这个bundle,然后运行整个项目,在选项》插件下找到这个插件,说明插件部署成功了。
    • 应用JItsi的UI加载机制
    public class EmployeebookPluginActivator implements BundleActivator{
    	
    	@Override
    	public void start(BundleContext arg0) throws Exception {
    	    // TODO Auto-generated method stub
    	    //在主窗口中加如一个TAB窗口,这个EmployeebookPanel 是一个JPanel 
    	    EmployeebookPanel employeePanel = new EmployeebookPanel(Container.CONTAINER_MAIN_TABBED_PANE);
    		
    	    Hashtable<String, String> containerFilter = new Hashtable<String, String>();
    		
    	    containerFilter.put(
                Container.CONTAINER_ID,
                Container.CONTAINER_MAIN_TABBED_PANE.getID());
    	    arg0.registerService(PluginComponent.class.getName(),employeePanel,containerFilter);
    	    //以上应用了Jitsi的插件UI管理机制,其中Container下有许多常量,代表着不同的容器,
                //通过这些容器我们可以方便地把需要的组件添加到菜单栏、状态栏都位置
           }
           @Override
           public void stop(BundleContext arg0) throws Exception { 
                // TODO Auto-generated method stub
           }
    }


    • 配置OSGI框架自启动我们的插件
            这一步我们按照OSGI的标准来就可以了,我们运行上面的Ant Target,发现项目sc-bundles目录下多出一个plugin-employeebook.jar文件,然后我们修改lib目录下的felix.client.run.properties文件,加入\ reference:file:sc-bundles/plugin-employeebook.jar,重启Jitsi项目,我们会发现插件被自动加载进来了。



     类似资料: