0

我有一个扩展名为pyd的Python C 扩展 DLL,我想通过Windows 上的System.loadLibrary将其加载到 Java 中。似乎没有办法加载扩展名不同于 *.dll 的 dll。

有什么建议的方法来克服这个问题吗?

用例

我打算在 Java 中嵌入 Python。我创建了一个在 JAVA 中加载的扩展 dll,使用 JNI 与扩展 dll 通信,后者又与 Python 运行时环境交互以执行 Python 语句

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

3 回答 3

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;
    }
}
于 2013-04-29T18:14:17.773 回答
1

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

如果您确实需要在 Java 中嵌入 CPython,那么“导入”.pyd文件对您没有帮助。A.pyd只有在 Python 解释器已经初始化的情况下才能正常工作,才会调用Py_Initialize().

您需要做的是查看 CPython嵌入文档,并根据这些文档中的示例使用 JNI 调用底层 CPython 函数。

更新

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

如果您确实需要在 CPython 中导入它,那么您可能应该将该功能拆分为两个单独的.dll文件——一个用于 JNI 嵌入,另一个仅用作扩展模块。

于 2013-04-29T18:17:30.797 回答
1

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

于 2013-04-29T18:18:58.183 回答