如何在OSGI Bundles中包含和使用.SO库文件

时间:2017-09-08 13:09:51

标签: maven osgi shared-libraries maven-plugin osgi-bundle

我是osgi bundle开发的新手。我正在开发osgi bundle以在ubuntu机器上运行。我想从osgi bundle访问共享库(.so文件)。我正在使用maven插件生成osgi bundle jar。

我在代码中添加了.so,如下图

shows code structure

这是我的pom文件,它生成osgi bundle jar。

 <build>
    <plugins>
        <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <extensions>true</extensions>
            <configuration>
                <instructions>
                    <Embed-StripVersion>true</Embed-StripVersion>
                    <Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
                    <Bundle-Name>${pom.artifactId}</Bundle-Name>
                    <Bundle-Version>${pom.version}</Bundle-Version>
                    <Import-Package>org.osgi.framework,
                        javax.net.ssl, javax.net, 
                        com.google.gson, 
                        com.google.gson.reflect,
                        org.osgi.service.blueprint.container
                    </Import-Package>
                    <Bundle-Activator>com.example.ModuleActivator</Bundle-Activator>
                    <Embed-Dependency></Embed-Dependency>
                    <Bundle-ClassPath>libexample.so, .</Bundle-ClassPath>
                    <Bundle-NativeCode>libexample.so</Bundle-NativeCode>
                    <Export-Package />
                    <Require-Capability />
                    <Embedded-Artifacts />
                </instructions>
            </configuration>
        </plugin>
    </plugins>
    <resources>
        <resource>
            <filtering>false</filtering>
            <directory>${basedir}/native</directory>
            <includes>
                <include>libexample.so</include>
            </includes>
    </resource>
    <resources>

下面的代码用于访问so库中定义的方法

System.loadLibrary("example"); test_app.helloWorld();

当我运行没有osgi的简单java代码时,我可以成功调用.so库函数。我可以从test_app.helloWorld();获得输出。

当我从bundle激活器调用osgi bundle中的System.loadLibrary("example");时,我没有得到任何Exception。但是当我调用库函数时,我得到异常java.lang.UnsatisfiedLinkError

这是maven插件生成的清单文件

`

Manifest-Version: 1.0
Bnd-LastModified: 1505136984891
Build-Jdk: 1.8.0_121
Built-By: Raj Sharma
Bundle-Activator: com.example.ModuleActivator
Bundle-ClassPath: libexample.so, .
Bundle-ManifestVersion: 2
Bundle-Name: ExampleModule
Bundle-NativeCode: libexample.so ; osname=linux ; processor=arm
Bundle-SymbolicName: ExampleModule
Bundle-Version: 2.0.5.Release
Created-By: Apache Maven Bundle Plugin
Embed-StripVersion: true
Import-Package: org.osgi.framework;version="[1.8,2)",javax.net.ssl,javax
 .net,com.google.gson;version="[2.5,3)",com.google.gson.reflect;version=
 "[2.5,3)",org.osgi.service.blueprint.container;version="[1.0,2)"
Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.8))"
Tool: Bnd-3.0.0.201509101326

`

这是生成的包内容

jar output

1 个答案:

答案 0 :(得分:0)

开始工作非常繁琐,但根据我的经验,一旦你掌握了它,就很容易合作。

我对Maven配置不太熟悉,但你是否嵌入了本机代码?看起来你正在解决系统上的显式文件,不知道它是否运行良好。

所以想出来:

    检查您的捆绑包,它是否包含本机代码?
    将其与[this] [1](例如)
等“已知”本机包进行比较
    清单中的路径是否与捆绑包中的本机文件的路径相对应?
    检查架构是否与OS / arch匹配:

Bundle-NativeCode: lwjgl32.dll;jemalloc32.dll;osname=Windows; processo r=x86,lwjgl.dll;jemalloc.dll;osname=Windows; processor=x86-64,liblwjg l.so;libjemalloc.so;osname=Linux; processor=x86-64,liblwjgl.dylib;lib jemalloc.dylib;osname=MacOSX; processor=x86-64

否则,请发布您的MANIFEST文件和捆绑包的布局。