使用System.loadLibrary加载Python C扩展DLL

时间:2013-04-29 17:43:03

标签: java python windows python-2.7

我有一个扩展名为Python C Extension DLLpyd,我希望在Windows上通过System.loadLibrary 加载Java。 似乎无法加载具有与* .dll不同的扩展名的dll。

是否有任何建议的方法可以解决这个问题?

使用案例

我计划在Java中嵌入Python。我创建了一个扩展dll,我在JAVA中加载,使用JNI与扩展dll进行通信,扩展dll又与Python Runtime Environment交互以执行Python语句

_____                     _____          _____
| J | System.loadLibrary  |   |          | P |
| A |-------------------->| P |          | Y |
| V |                     | Y |<-------->| T |
| A |       JNI           | D |          | H |
|___|<------------------->|___|          | O |
                                         | N |
                                         |___|

3 个答案:

答案 0 :(得分:4)

您是否尝试过使用System.load()?您可以指定所需的任何文件名,但缺点是您需要.pyd文件的完整路径。


搜索将从中加载.dll的路径并不困难:

for (String s: System.getProperty("java.library.path").split(";")) {
    String pydName = s + "/mypythonlib.pyd";
    File pydFile = new File(pydName);
    if (pydFile.exists()) {
        System.load(pydName);
        break;
    }
}

答案 1 :(得分:1)

好吧,如果您只想在Java中运行Python代码,那么Jython将允许您将Python源代码编译为Java .class字节码,但您将无法使用任何CPython功能它使用扩展模块。

如果你真的需要在Java中嵌入CPython,那么'导入'.pyd文件对你没有帮助。如果已经初始化Python解释器,.pyd将仅在Py_Initialize()调用时才能正常运行。

您需要做的是查看CPython embedding docs,并使用JNI根据这些文档中的示例调用基础CPython函数。

<强>更新

听起来你拥有的是一个.dll文件,它充当扩展模块,但也公开了一些用于在Java中嵌入Python的符号。如果您从未打算在CPython中导入它,那么只需将其重命名为.dll

如果你确实需要在CPython中导入它,那么你可能应该将功能分成两个独立的.dll文件 - 一个用于JNI嵌入,另一个用作扩展模块

答案 2 :(得分:1)

Calling Python in Java?。基本上,您使用org.python.util.PythonInterpreter来调用Python或Jython。另一种可能的解决方案是使用UNIX风格的.so文件。另一种选择可能是使用获取当前路径,将其与.pyd文件的名称合并,并使用Markku K指定的System.load()。