【问题标题】:How to include native library (JNI) in play 2.1 RC2?如何在 play 2.1 RC2 中包含本机库 (JNI)?
【发布时间】:2013-01-16 14:01:14
【问题描述】:

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

如何在应用程序运行时使本机库可用?在哪里可以指定要包含的本机 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)

提前感谢您的意见!

【问题讨论】:

    标签: java playframework playframework-2.0 tfs-sdk java.library.path


    【解决方案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”不加载库。

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
    • 答案在第二句:使用“play start”而不是“play run”。我正在修改答案以使其更加明显。
    【解决方案2】:

    当使用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

    【讨论】:

    • 感谢@archer 的回复。我熟悉使用静态块加载。现在,我正在寻找使用播放框架实现类似的东西。 (使用现有的加载器/设置)
    猜你喜欢
    • 1970-01-01
    • 2012-12-29
    • 2012-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    相关资源
    最近更新 更多