如何在play框架中使用kyotocabinet(JNI)?

时间:2011-11-16 08:35:40

标签: java java-native-interface playframework kyotocabinet

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

我正在使用Eclipse和playframework-1.2.3。 和kyotocabinet是本机库所以我正在使用它的Java-Binding。

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

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中的构建已完成但在运行时发生错误。

我想这是因为缺少kyotocabinet.dll。(只发现了jkyotocabinet.jar) 我将kyotocabinet.dll的位置配置为Java Build Path>来源>本地图书馆我的playframework项目的位置。 其他项目也很好。

如何在playframework中使用本机库? 任何示例或教程?

Play.getFile和System.load无效。

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!Framework无法加载本机库。 http://d.hatena.ne.jp/hjym_u/20110702/1309609277

我已经尝试过这些:绝对路径,相对路径,System.load,System.loadLibrary,Play.getFile。

作为决定性的方法,我把jkyotocabinet.dll放到当前目录(D:/ MyProejct /),然后写了这段代码。

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在当前目录中,所以jvm应该自动找到它。

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

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

项目/ CONF / application.conf

#application.mode=dev
application.mode=prod

2 个答案:

答案 0 :(得分:1)

我假设你只需要通过System.load

将dll加载到Java中

如果将ddl放在项目中,可以通过{O_ApplicationStart控制器内的Play.getFile加载它。这应该在JVM存活时可以使用它。

编辑:

@KenichiYamamoto Play.getFile从应用程序路径获取文件。你正试图在那里使用完整的路径。

Read this关于在容器中加载文件。可能是(由于Play编译重装系统)您正在遇到“已加载”错误。尝试通过在@OnApplicationStart

中的静态块中添加System.load来关注该示例

答案 1 :(得分:0)

如pere所说,但使用应用程序根目录中的相对路径。不是绝对的道路。即Play.getFile( “LIB \ myfile.dll”)