首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在playframework中使用kyoto机柜(JNI)?

如何在playframework中使用kyoto机柜(JNI)?
EN

Stack Overflow用户
提问于 2011-11-16 16:35:40
回答 2查看 1.6K关注 0票数 1

我正在尝试使用Playframework中的kyotocabinet。发生了以下错误。

我使用的是Eclipse和playframework-1.2.3。并且kyotocabinet是本地库,所以我使用它的Java绑定。

重现代码很简单。在控制器中:

代码语言:javascript
复制
public static void somePage() {
    DB db = new DB();//error occurred
    render();
}

Internal Server Error (500) for request GET /
Execution exception (In /app/controllers/TestApp.java around line 45)
NoClassDefFoundError occured : Could not initialize class kyotocabinet.DB

play.exceptions.JavaExecutionException: Could not initialize class kyotocabinet.DB
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:229)
    at Invocation.HTTP Request(Play!)
Caused by: java.lang.NoClassDefFoundError: Could not initialize class kyotocabinet.DB
    at controllers.TestApp.somePage(TestApp.java:45)
    at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:546)

    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:500)
    at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:476)

    at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:471)

    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:159)
    ... 1 more

Eclipse中的构建已完成,但在运行时出错。

(只找到了jkyotocabinet.jar )我将kyotocabinet.dll的位置配置为我的播放框架项目的Java Build Path > Source > Native Library location。在其他项目中也很好。

如何在playframework中使用本机库?有没有什么例子或教程?

Play.getFile和System.load都不起作用。

代码语言:javascript
复制
package controllers;
import play.Play;
import play.jobs.*;

@OnApplicationStart
public class Bootstrap extends Job {
public void doJob() {
    String path = "D:/MyProject/lib/jkyotocabinet.dll";
    Play.getFile(path);
    //System.load(path); if this was enabled, following error occurred: "Native Library D:\MyProject\lib\jkyotocabinet.dll already loaded in another classloader". so I guess the dll was loaded.
    System.out.println("bootstrap loaded");//this is displayed.
}
}

UnsatisfiedLinkError occured : no jkyotocabinet in java.library.path

这篇日文博客告诉我们Play!框架无法加载本机库。http://d.hatena.ne.jp/hjym_u/20110702/1309609277

我已经尝试过了:绝对路径、相对路径、System.load、System.loadLibrary、Play.getFile。

作为最终的方法,我将jkyotocabinet.dll放到当前目录(D:/MyProejct/),并编写了以下代码。

代码语言:javascript
复制
public static void somePage(){
    File f = Play.getFile("jkyotocabinet.dll");
        if(f != null && f.isFile() && f.canRead() && f.canExecute()){//true
            DB db = new DB();//error occured. it reached here.
        }
    render();
}

Execution exception
NoClassDefFoundError occured : Could not initialize class kyotocabinet.DB

Play.getFile找到了路径" jkyotocabinet.dll“,所以jkyotocabinet.dll在当前目录中,所以它应该会自动找到它。

任何人都可以在playframework中使用JNI?

最后,我可以使用kyotocabinet作为PROD模式,而不是DEV模式。

Project/conf/application.conf

代码语言:javascript
复制
#application.mode=dev
application.mode=prod
EN

回答 2

Stack Overflow用户

发布于 2011-11-16 18:27:59

我假设您只需要通过System.load将动态链接库加载到Java中

如果你把动态链接库放在你的项目上,你可以通过@OnApplicationStart控制器中的Play.getFile来加载它。这应该使它在JVM处于活动状态时对您的应用程序可用。

编辑:

@KenichiYamamoto Play.getFile从应用程序路径获取文件。您正在尝试使用其中的完整路径。

关于在容器中加载文件的Read this。这可能是(由于播放编译-重新加载系统)您遇到了“已加载”错误。尝试效仿此示例,在@OnApplicationStart的静态块中添加System.load

票数 1
EN

Stack Overflow用户

发布于 2011-11-16 20:39:31

按照pere说的做,但要使用应用程序根目录的相对路径。而不是绝对路径。即Play.getFile("lib\myfile.dll")

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8148758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档