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

Java 如何在play 2.1 RC2中包含本机库(JNI)?,java,playframework,playframework-2.0,tfs-sdk,java.library.path,Java,Playframework,Playframework 2.0,Tfs Sdk,Java.library.path,我正在使用playframework2.1rc2构建一个利用tfsjavasdk的应用程序TFS API要求包含一组本机dll(例如native_auth.dll) 当应用程序运行时,如何使本机库可用?在哪里可以指定要包括的本机DLL 更新: 我尝试了staticblockSystem.load(“完整路径”)并使用 app.classloader().loadClass(“NativeUtils.class”),但我还是得到了一个例外: java.lang.unsatifiedlinkerro

我正在使用
playframework2.1rc2
构建一个利用
tfsjavasdk
的应用程序
TFS API
要求包含一组本机dll(例如
native_auth.dll

当应用程序运行时,如何使本机库可用?在哪里可以指定要包括的本机DLL

更新: 我尝试了
static
block
System.load(“完整路径”)
并使用
app.classloader().loadClass(“NativeUtils.class”),但我还是得到了一个例外:

java.lang.unsatifiedlinkerror:com.microsoft.tfs.jni.internal.platformmisc.NativePlatformMisc.nativeGetEnvironmentVariable(Ljava/lang/String;)Ljava/lang/String;
位于com.microsoft.tfs.jni.internal.platformmisc.NativePlatformMisc.nativeGetEnvironmentVariable(本机方法)
位于com.microsoft.tfs.jni.internal.platformmisc.NativePlatformMisc.getEnvironmentVariable(NativePlatformMisc.java:134)
位于com.microsoft.tfs.jni.PlatformMiscUtils.getEnvironmentVariable(PlatformMiscUtils.java:52)
位于com.microsoft.tfs.core.config.httpclient.DefaultHTTPClientFactory.shouldAcceptUntrustedCertificates(DefaultHTTPClientFactory.java:288)
位于com.microsoft.tfs.core.config.httpclient.DefaultHTTPClientFactory.configureClientParams(DefaultHTTPClientFactory.java:324)
位于com.microsoft.tfs.core.config.httpclient.DefaultHTTPClientFactory.newHTTPClient(DefaultHTTPClientFactory.java:137)
位于com.microsoft.tfs.core.TFSConnection.getHTTPClient(TFSConnection.java:1041)
位于com.microsoft.tfs.core.TFSConnection.getWebService(TFSConnection.java:874)
位于com.microsoft.tfs.core.config.client.DefaultClientFactory$9.newClient(DefaultClientFactory.java:265)
位于com.microsoft.tfs.core.config.client.DefaultClientFactory.newClient(DefaultClientFactory.java:90)
位于com.microsoft.tfs.core.TFSConnection.getClient(TFSConnection.java:1470)
在com.microsoft.tfs.core.tfstreamprojectcollection.getWorkItemClient(tfstreamprojectcollection.java:370)


提前感谢您的投入

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

因此,在运行应用程序时,只需指定
-Djava.library.path=

更多细节是。

我在OpenCV库中也遇到了同样的问题。我在这里找到了解决方案:

必须使用“播放开始”命令而不是“播放运行”命令运行应用程序

“play run”命令在开发模式下启动应用程序,“play start”命令在生产模式下启动。我不知道他们之间有什么不同但有一点很明显

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


如果您使用“播放开始”命令运行播放应用程序,它将工作。不幸的是,“play run”没有加载LIB。

感谢@archer的回复。我熟悉使用静态块加载。现在,我正在考虑使用play框架实现类似的功能。(使用现有加载程序/设置)虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能无效。答案在第二句中:使用“播放开始”而不是“播放运行”。我正在修改答案,使之更加明显。