我是osgi bundle开发的新手。我正在开发osgi bundle以在ubuntu机器上运行。我想从osgi bundle访问共享库(.so
文件)。我正在使用maven插件生成osgi bundle jar。
我在代码中添加了.so
,如下图
这是我的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
`
这是生成的包内容
答案 0 :(得分:0)
开始工作非常繁琐,但根据我的经验,一旦你掌握了它,就很容易合作。
我对Maven配置不太熟悉,但你是否嵌入了本机代码?看起来你正在解决系统上的显式文件,不知道它是否运行良好。
所以想出来:
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文件和捆绑包的布局。