2013-01-16 46 views
2

我正在使用Play Framework 2.1 RC2來構建利用TFS Java SDK的應用程序。 TFS APIs需要包括一組本地dll(例如native_auth.dll)。如何在Play 2.1 RC2中包含本地庫(JNI)?

如何在應用程序運行時使本機庫可用?我可以在哪裏指定要包含的本地dll?

更新: 我試過staticSystem.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)

預先感謝您的投入!

回答

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

+0

感謝@archer的迴應。我熟悉使用靜態塊加載。現在,我正在使用遊戲框架來實現類似的功能。 (使用現有的裝載機/設置) – Ajay

1

我和OpenCV庫有同樣的問題。我在這裏找到了解決方案:http://answers.opencv.org/question/16689/jni-error-on-playframework-v211/

您必須使用「play start」命令運行您的應用程序,而不是「play run」。

「play run」命令以開發模式啓動您的應用程序,「play start」命令以生產模式啓動。我不知道它們之間的所有差異,但有一點很明顯,

只有當我們使用「play start」時,纔會啓動一個新的JVM for應用程序,並加載由System.load指定的本機庫(.. 。)

如果您使用「play start」命令運行您的play應用程序,它將起作用。不幸的是,「播放運行」不會加載庫。

+0

儘管此鏈接可能會回答問題,但最好在此處包含答案的基本部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 –

+0

答案在第二句中:使用「play start」而不是「play run」。我正在修改答案,使之更加明顯。 –

1

我沒有找到問題的解決方案,除了運行播放開始,並且在開發過程中將其作爲播放開始運行時,所以我創建了一個問題:https://github.com/playframework/playframework/issues/2212。如果遇到問題,可以在那裏添加評論,描述情況。 在那裏添加一條評論,在問題列表中引發爭議。問題的上限是,更高的可能性,它會被修復。

相關問題