能否不依赖第三方库将Python编译为DLL,通过Java JNI接口调用其函数
核心结论
完全不依赖第三方库、直接将Python代码编译为可被JNI直接调用的原生DLL,没有可行的实现路径。
具体原因
- Python是解释型语言,官方没有提供原生能力可以直接将
.py代码编译为纯机器码的DLL,市面上所有Python转exe/dll的工具本质都是把Python解释器、依赖库和你的脚本打包到一起,运行时还是解释执行,也不会自动生成符合JNI调用规范的导出函数。 - JNI对调用的原生库有严格的命名、参数传递规范,只有C/C++这类可以直接按规则编写导出函数的语言才能直接编译成符合要求的DLL,Python没有这类原生支持。
可行实现方案(仅依赖Java JNI和Python官方自带组件,无额外第三方库)
你可以自己编写一层C/C++桥接层,将桥接层编译为DLL供Java调用,桥接层内部嵌入Python解释器执行你的Python代码,具体步骤如下:
- 生成JNI头文件:在你的
hello.java所在目录执行javac -h . hello.java,会自动生成符合JNI规范的C/C++头文件,里面定义了native方法对应的导出函数签名。 - 编写C/C++桥接代码,核心逻辑包括:
- 初始化Python解释器
- 加载你编写的
hello.py模块 - 实例化
ATestClass类对象 - 将JNI传递过来的float参数转换为Python的float类型,调用
run_something_very_important方法 - 将Python返回的浮点结果转换为JNI支持的float类型返回,同时做好Python对象、解释器的资源释放,避免内存泄漏
- 编译C/C++代码为
hello.dll,编译时需要链接你本地Python环境对应的python3x.lib库,引入Python的头文件目录。 - 运行Java代码时,确保
hello.dll、hello.py、Python运行时依赖都在系统的库加载路径下即可正常运行。
内容的提问来源于stack exchange,提问作者Day Trip
相关产品推荐
相关产品推荐

