我有一个扩展名为pyd的Python C Extension 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 |
|___|
好吧,如果您只想在Java中运行Python代码,那么Jython将允许您将Python源代码编译成Java
.class
字节码,但是您不能使用任何使用扩展模块的CPython功能。在如果您真的需要在Java中嵌入CPython,那么“导入”一个
.pyd
文件对您没有帮助。只有在Python解释器已经初始化的情况下,.pyd
才会正常工作。在您需要做的是查看CPythonembedding docs,并按照这些文档中的示例使用JNI调用底层CPython函数。在
更新
听起来像是一个单独的
.dll
文件,它充当一个扩展模块,但也暴露了一些用于在Java中嵌入Python的符号。如果您从未计划在CPython中导入它,那么只需将其重命名为.dll
。在如果您确实需要在CPython中导入它,那么您可能应该将该功能分成两个独立的
.dll
文件——一个在JNI嵌入中使用,另一个只是充当扩展模块。在见Calling Python in Java?。基本上,您可以使用
org.python.util.PythonInterpreter
来调用Python或Jython。另一个可能的解决方案是使用UNIX样式的.so文件。另一个选择可能是使用get the current path,将其与.pyd文件名合并,然后使用系统负荷()按Markku K的规定你试过用System.load()代替吗?您可以指定所需的任何文件名,但缺点是需要.pyd文件的完整路径。在
搜索将从中加载.dll的路径并不困难:
相关问题 更多 >
编程相关推荐