OSGi服务:java.lang.UnsatisfiedLinkError调用DLL - 当DLL称为单元测试时没有错误

时间:2013-04-05 13:18:00

标签: java dll java-native-interface osgi swig

用于视频编码的Java类加载包含C ++代码的DLL

Unpacking debugging symbols for VideoSource.dll to \path
Checking for VideoSource.pdb...
Checking for videosource.pdb...

然后尝试从该DLL实例化本机(C ++)类:

    // VideoSource() is implemented in C++ and wrapped with JNI, 
    // wrapper files were generated with SWIG 
    _videoProvider = new generated.VideoSource(); 

当Java类作为JUnit测试执行时(视频数据被提取),这是有效的。

当我将Java类作为OSGi服务启动时,同样的事情不起作用。

基本上,执行相同的代码。 DLL仍然成功加载,但上面显示的本机(C ++)类的实例化现在抛出异常:

    java.lang.UnsatisfiedLinkError: generated.VideoSourceSWIGJNI.new_VideoSource()J

当我将Java类作为OSGi服务启动而不是将其作为JUnit测试执行时有何不同?我该怎么做才能让它发挥作用?



背景
generated.VideoSource()是

    public VideoSource() {
       this(VideoSourceSWIGJNI.new_VideoSource(), true);
    }

VideoSourceSWIGJNI.new_VideoSource()

    public final static native long new_VideoSource();

C ++实现

VideoSource::VideoSource() {    
   // init frame count
   m_frame_cnt = 0;
   [..]
}

1 个答案:

答案 0 :(得分:1)

谢谢,Puce,推了我一下。在询问“我是否必须尝试任何东西”?我很快得到了答案:

为了用我自己的话来恢复来源(1234):

当本机代码时,例如.so或.dll库,应在OSGi包中使用,必须在包的清单中声明相应的库。

清单文件可以明确地编辑,如上述来源中所述,或者通过适当的插件隐含地编辑,例如, apache felix,当使用maven时。已使用的插件在POM文件中配置,并将自动修改清单。