2009-06-22 74 views
1

我有一个RCP应用程序(简称RCP-APP)。我创建了一个包含媒体播放器api(.jar文件)的新插件(称为插件A)和一个媒体播放器api通过JNA访问的C库(dll)文件夹。然后我创建了另一个插件(称为插件B),其中包含依赖于插件A的媒体播放器应用程序。Eclipse RCP /插件问题

当插件B被激活时,我收到以下错误消息,通知我Plug-在B因找不到球员.DLL文件是媒体正在寻找:

 
!ENTRY org.eclipse.jface 4 2 2009-06-22 10:05:22.475 
!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.jface". 
!STACK 0 
java.lang.UnsatisfiedLinkError: Unable to load library 'libvlc': The specified module could not be found. 

    at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:114) 
    at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:157) 
    at com.sun.jna.Library$Handler.(Library.java:123) 
    at com.sun.jna.Native.loadLibrary(Native.java:260) 
    at com.sun.jna.Native.loadLibrary(Native.java:246) 
    at org.videolan.jvlc.internal.LibVlc.(LibVlc.java:41) 
    at org.videolan.jvlc.JVLC.(JVLC.java:45) 
    at com.bah.gs.arts.jekyll.plugins.videolog.VideoLogDisplay.displayStream(VideoLogDisplay.java:32) 
    at com.bah.gs.arts.jekyll.core.extensionpoints.DisplayStreamFactory.getDisplayStreams(DisplayStreamFactory.java:57) 
    at com.bah.gs.arts.jekyll.core.views.medialist.MediaListView$1.doubleClick(MediaListView.java:91) 
    at org.eclipse.jface.viewers.StructuredViewer$1.run(StructuredViewer.java:799) 
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37) 
    at org.eclipse.core.runtime.Platform.run(Platform.java:880) 
    at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:48) 
    at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:175) 
    at org.eclipse.jface.viewers.StructuredViewer.fireDoubleClick(StructuredViewer.java:797) 
    at org.eclipse.jface.viewers.AbstractTreeViewer.handleDoubleSelect(AbstractTreeViewer.java:1419) 
    at org.eclipse.jface.viewers.StructuredViewer$4.widgetDefaultSelected(StructuredViewer.java:1173) 
    at org.eclipse.jface.util.OpenStrategy.fireDefaultSelectionEvent(OpenStrategy.java:237) 
    at org.eclipse.jface.util.OpenStrategy.access$0(OpenStrategy.java:234) 
    at org.eclipse.jface.util.OpenStrategy$1.handleEvent(OpenStrategy.java:295) 
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) 
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1003) 
    at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3823) 
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3422) 
    at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2384) 
    at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2348) 
    at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2200) 
    at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:495) 
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:288) 
    at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:490) 
    at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149) 
    at com.bah.gs.arts.jekyll.core.Application.start(Application.java:20) 
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:193) 
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110) 
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79) 
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:386) 
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:549) 
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:504) 
    at org.eclipse.equinox.launcher.Main.run(Main.java:1236) 
    at org.eclipse.equinox.launcher.Main.main(Main.java:1212) 

如何告知插件B(或RCP-APP)的.DLL文件是在一个特定的文件夹中的插件A

看来,api希望通过它的环境PATH变量找到.dll。

我该如何沟通“插件A /文件夹名称”

感谢您的协助。

回答

1

要访问的.dll文件的插件,-A /文件夹,您需要访问的插件A.的Bundle实例的方法之一是实现一个Activator的插件中,其至少延伸类Plugin (“PluginA”)。

呼叫PluginA.getDefault().getBundle().getEntry("folder/some.dll")将返回一个URL到.DLL文件。

恕我直言,最好将直接访问.DLL文件的所有代码插入到插件A.这样您就不需要将插件的内部文件结构公开给它的用户。

+0

”恕我直言,最好将直接访问.DLL文件的所有代码插入到插件A.这样您就不需要将插件的内部文件结构公开给它的用户。“ 确实如此。但是,这推断出我创建的每个插件都使用媒体播放器api,它将包含dll和.jar文件的副本,这正是我试图通过放置.jar文件和。 – 2009-06-22 15:01:45

+0

无论如何.....我api试图通过PAT变量找到.dlls我误以为能够将位置作为参数传递给api – 2009-06-22 15:22:21

1

你可能会想看看插件片段;这提供了一种机制来让公众面对Java(特定于平台的)dll/so文件。

SWT的包装将是一个开始寻找这类问题的好地方。

0

你可以建立一个“二进制文件”插件,把dll放在它的一个子文件夹中,然后确保在清单 *中添加一个激活器+单件属性。 *您检查斌/“生成”,“运行时编译”部分

在包含二进制文件的插件的功能,请务必检查“安装后解压插件压缩”

在您的二进制文件的插件的激活剂,添加如下内容:

public enum Tool {reach, ctl, ltl}; 
private static URI toolUri [] = new URI [3]; 

public static URI getProgramURI(Tool tool) throws IOException { 
    if (toolUri[tool.ordinal()] == null) { 
     String relativePath = "bin/its-"+ tool.toString() ; 
     URL toolff = getDefault().getBundle().getResource(relativePath); 
     if (toolff == null) { 
      log.severe("unable to find an executable [" + tool + "] in path " + relativePath); 
      Enumeration<URL> e = getDefault().getBundle().findEntries("bin/", "*", true); 
      log.fine("Lising URL available in bin/"); 
      while (e.hasMoreElements()) { 
       log.finer(e.nextElement().toString()); 
      } 
      throw new IOException("unable to find the tool binary"); 
     } 
     URL tmpURL = FileLocator.toFileURL(toolff); 

     // use of the multi-argument constructor for URI in order to escape appropriately illegal characters 
     URI uri; 
     try { 
      uri = new URI(tmpURL.getProtocol(), tmpURL.getPath(), null); 
     } catch (URISyntaxException e) { 
      throw new IOException("Could not create a URI to access the binary tool :", e); 
     } 
     toolUri[tool.ordinal()] = uri; 
     log.fine("Location of the binary : " + toolUri); 

     File crocExec = new File(uri); 
     if (!crocExec.setExecutable(true)) { 
      log.severe("unable to make the command-line tool executable [" + toolUri + "]"); 
      throw new IOException("unable to make the command-line tool executable"); 
     }  

    } 
    return toolUri[tool.ordinal()]; 
} 

我将复制我的一些代码,粘贴,很遗憾它并不完全匹配您的DLL的例子,我是从限制列表中获取可执行的路径(见枚举工具)。最后一步(在文件上设置+ x标志)在您的情况下可能没有用处。另一方面,你可以免费得到一些异常处理代码和缓存:)并且它的测试非常彻底。

它执行您正在尝试做的工作,将url传递给下游插件的二进制文件。 “