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

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

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

更新:我尝试了staticSystem.load("full path")并使用app.classloader().loadClass("NativeUtils.class");加载它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)

提前感谢您的投入!

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

因此,在运行应用程序时,您应该简单地指定-Djava.library.path= 。 关于这方面的更多细节在这里 。

我在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”不会加载libs。

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