如何在2.1 RC2中包含本机库(JNI)?

时间:2013-01-16 14:01:15

标签: java playframework playframework-2.0 tfs-sdk nativelibrary

我正在使用Play Framework 2.1 RC2构建一个使用TFS Java SDK的应用程序。 TFS APIs需要包含一组原生dll(例如native_auth.dll)。

如何在应用程序运行时使本机库可用?我在哪里可以指定要包含的本机dll?

更新: 我尝试static阻止System.load("full path")并使用加载它 app.classloader().loadClass("NativeUtils.class"); ,但我仍然得到例外:

java.lang.UnsatisfiedLinkError: com.microsoft.tfs.jni.internal.platformmisc.NativePlatformMisc.nativeGetEnvironmentVariable(Ljava/lang/String;)Ljava/lang/String; at com.microsoft.tfs.jni.internal.platformmisc.NativePlatformMisc.nativeGetEnvironmentVariable(Native Method) at com.microsoft.tfs.jni.internal.platformmisc.NativePlatformMisc.getEnvironmentVariable(NativePlatformMisc.java:134) at com.microsoft.tfs.jni.PlatformMiscUtils.getEnvironmentVariable(PlatformMiscUtils.java:52) at com.microsoft.tfs.core.config.httpclient.DefaultHTTPClientFactory.shouldAcceptUntrustedCertificates(DefaultHTTPClientFactory.java:288) at com.microsoft.tfs.core.config.httpclient.DefaultHTTPClientFactory.configureClientParams(DefaultHTTPClientFactory.java:324) at com.microsoft.tfs.core.config.httpclient.DefaultHTTPClientFactory.newHTTPClient(DefaultHTTPClientFactory.java:137) at com.microsoft.tfs.core.TFSConnection.getHTTPClient(TFSConnection.java:1041) at com.microsoft.tfs.core.TFSConnection.getWebService(TFSConnection.java:874) at com.microsoft.tfs.core.config.client.DefaultClientFactory$9.newClient(DefaultClientFactory.java:265) at com.microsoft.tfs.core.config.client.DefaultClientFactory.newClient(DefaultClientFactory.java:90) at com.microsoft.tfs.core.TFSConnection.getClient(TFSConnection.java:1470) at com.microsoft.tfs.core.TFSTeamProjectCollection.getWorkItemClient(TFSTeamProjectCollection.java:370)

提前感谢您的投入!

3 个答案:

答案 0 :(得分:1)

使用System.loadLibrary时,我们唯一指定的是我们想要的DLL文件的名称。 JVM将在“Java库路径”中搜索它。这是由java.library.path系统属性给出的路径(因此可以使用-D选项在java.exe命令行上进行更改)。它的默认值似乎与Windows路径有关,虽然看起来有点混乱,但我不太确定如何或为什么。换句话说,我不确定Windows JVM如何创建java.library.path的初始值。

因此,您应该在运行应用程序时简单地指定-Djava.library.path=<path to your dlls>。 有关详细信息,请here

答案 1 :(得分:1)

我遇到了与OpenCV库相同的问题。我在这里找到了解决方案:http://answers.opencv.org/question/16689/jni-error-on-playframework-v211/

  

您必须使用“play start”命令运行应用程序,而不是“play run”。

     

“play run”命令在开发模式下启动应用程序,“play start”命令在生产模式下启动。我不知道他们之间的每一个区别,但一个显而易见的事情是,

     

只有当我们使用“play start”时,才会启动一个适用于您的应用程序的新JVM,它会加载您由System.load指定的本机库(...)

如果使用“play start”命令运行播放应用程序,它将起作用。不幸的是,“play run”不会加载库。

答案 2 :(得分:1)

我没有找到问题的解决方案,除了运行play start,并且在开发糟糕时将其作为播放开始运行,所以我创建了一个问题:https://github.com/playframework/playframework/issues/2212。如果遇到问题,可以添加注释,描述情况。 添加评论会在问题列表中添加评论。问题的上限是,更高的概率,它将被修复。