Java native interface 从JNI加载OSGi类

Java native interface 从JNI加载OSGi类,java-native-interface,osgi,eclipse-rcp,tycho,Java Native Interface,Osgi,Eclipse Rcp,Tycho,我调用一些C++代码,试图加载java类,例如 JNIEnv *jenv = ... jclass cls = jenv->FindClass("org/some/bundle/SomeClass"); 现在,问题是这个类驻留在OSGi包中,上面的代码找不到我的类 此问题仅在运行单元测试(Tycho surefire headless tests)时出现。有没有一种简单的方法可以强制OSGi框架从JNI中找到我的类?在Java方面,我怀疑像Dynamic ImportPackage这样的

我调用一些C++代码,试图加载java类,例如

JNIEnv *jenv = ...
jclass cls = jenv->FindClass("org/some/bundle/SomeClass");
现在,问题是这个类驻留在OSGi包中,上面的代码找不到我的类


此问题仅在运行单元测试(Tycho surefire headless tests)时出现。有没有一种简单的方法可以强制OSGi框架从JNI中找到我的类?在Java方面,我怀疑像
Dynamic ImportPackage
这样的东西可以解决我的问题。我不愿意改变第三方C++库,只是为了让它与测试框架一起工作,所以如果可能的话,我更喜欢java测试设置/配置方面的解决方案。

< P> JNENV的FIDECH类方法只搜索由全局应用程序类路径定义的系统类加载器的内容。因为OSGi不使用全局类路径,所以这不起作用也就不足为奇了


通常,无论何时加载一个类,您不仅需要指定类名,还需要指定应该加载它的类加载器。这是模块化的必然要求。因此,您的代码需要能够找到希望包含该类的包,然后调用其loadClass方法。你可以直接在C++代码中执行这一操作,但是编写java实用工具方法更容易,然后调用C++的方法。< /p> < p>嗯,我不确定你的情况和我的一样。100%。 在我的RCP中,我经常得到异常:

ClassNotFoundException:com.tool.packageA.iWantToLoad无法通过com.tool.packageB_1.0.0.0找到此类


一个简单的解决办法是:

  • com.tool.packageA添加到com.tool.packageBMANIFEST.MF文件包
我想避免这种解决方案,因为我能够加载其他包中的其他类,通常com.tool.packageC,com.tool.packageC(这不是我做的,所以我不知道它是如何工作的)


四处搜索,我找到了另一个解决方案,我最终用它来保持与当前工作包类似的东西(com.tool.packageC,com.tool.packageC

解决办法是:

  • 使用Eclipse BuddyPolicy和Eclipse RegisterBuddy
这是如何让它工作的:

  • 将Eclipse BuddyPolicy:registered添加到com.tool.packageBMANIFEST.MF
  • 将Eclipse注册表buddy:com.tool.packageB添加到com.tool.packageAMANIFEST.MF
  • Require Bundle:com.tool.packageB
    添加到com.tool.packageAMANIFEST.MF
  • 现在,com.tool.packageA.IWantToLoadThisClass将从com.tool.packageB中可见,您可以在
    jenv->FindClass(“com/tool/packageA/IWantToLoadThisClass”)中找到它


    我希望这能有所帮助。

    我理解,这也证实了我的假设。问题是,我能通过简单的重新配置来绕过这个问题,而不改变C++库(我没有直接控制)吗?例如,我尝试将“org .Osg.Frase.Story.Spopy.Excel”设置为C++代码加载的类的捆绑,但它没有帮助。正如我所说,JNIEnv读取全局应用程序类路径。通过从系统包中导出类路径类,可以使类路径类在OSGi包中可见。。。这就是
    org.osgi.framework.system.packages.extra
    设置实现的功能。但您需要的是转向另一个方向:从OSGi包导入到系统包,这是不可能的。我能想到的唯一方法是将类移动到全局类路径中,然后从那里导出。好的,谢谢。你写的完全有道理。我目前无法做到这一点(需要一些思考和重构),但我相信我可以利用您的建议来实现这一点。在Eclipse/RCP环境中支持遗留代码的痛苦:)