我有一个扩展名为Python C Extension DLL的pyd,我希望在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 |
|___|
答案 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()。