JPype 编译问题

3 投票
3 回答
3839 浏览
提问于 2025-04-16 03:45

我在使用JPype的时候遇到了很多麻烦。我在Windows上设置了开发环境,但安装的时候一直失败。后来我又在Ubuntu上试了一下,结果还是不行。现在我有点绝望了。我使用的是Mingw32,因为我尝试安装VS2008,但它告诉我需要安装XP SP2,而我用的是Vista。我又试了VS2010,但也没成功,出现了“错误:找不到vcvarsall.bat”的提示。总之,现在我在用Mingw32。

我其实是想用Neo4j和Python,所以需要用到JPype。我在网上找了很多关于MySQL的问题,但都没能帮我解决JPype的问题。

如果我能解决Windows或Unix的问题,我就能继续了,所以任何帮助都非常感谢。

这是我的版本信息:

Windows: Vista 64
Python: 2.6
编译器 Mingw32: 最新版本
JPype: 0.5.4.1
Java信息:
java版本 "1.6.0_13"
Java(TM) SE运行环境 (构建 1.6.0_13-b03)
Java HotSpot(TM) 64位服务器虚拟机 (构建 11.3-b02, 混合模式)

我运行了:

python setup.py install --compiler=wingw32

然后得到了以下输出:

选择Windows配置
运行安装
运行构建
运行build_py
运行build_ext
构建'_jpype'扩展
C:\MinGW\bin\gcc.exe -mno-cygwin -mdll -O -Wall -DWIN32=1 "-IC:\Program Files (x86)\Java\jdk1.6.0_21/include" "-IC:\Program Files (x86)\Java\jdk1.6.0_21/include/win32" -Isrc/native/common/include -Isrc/native/python/include -Ic:\Python26\include -Ic:\Python26\PC -c src/native/common/jp_array.cpp -o build\temp.win32-2.6\Release\src\native\common\jp_array.o /EHsc
src/native/common/jp_array.cpp: 在成员函数 'void JPArray::setRange(int, int, std::vector&)' 中:
src/native/common/jp_array.cpp:56:13: 警告: 有符号和无符号整数表达式之间的比较
src/native/common/jp_array.cpp:68:4: 警告: 从字符串常量到 'char*' 的转换已过时
src/native/common/jp_array.cpp: 在成员函数 'void JPArray::setItem(int, HostRef*)' 中:
src/native/common/jp_array.cpp:80:3: 警告: 从字符串常量到 'char*' 的转换已过时
gcc: /EHsc: 没有那个文件或目录
错误: 命令 'gcc' 失败,退出状态为 1

在Ubuntu上的问题如下:

Java版本: 1.6.0_18
JPype: 0.5.4.1
Python: 2.6

Java已经在路径中,我刚刚运行了apt-get install build-essentials,所以有最新的GCC等。

我不会粘贴所有的输出,因为太多了。错误信息很多,感觉像是我漏掉了Java的安装,但实际上没有。输入java可以进入上面的版本。这是开始的部分:

运行安装
运行构建
运行build_py
运行build_ext
构建'_jpype'扩展
gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I/usr/lib/jvm/java-1.5.0-sun-1.5.0.08/include -I/usr/lib/jvm/java-1.5.0-sun-1.5.0.08/include/linux -Isrc/native/common/include -Isrc/native/python/include -I/usr/include/python2.6 -c src/native/common/jp_javaenv_autogen.cpp -o build/temp.linux-i686-2.6/src/native/common/jp_javaenv_autogen.o
cc1plus: 警告: 命令行选项 "-Wstrict-prototypes" 对于Ada/C/ObjC有效,但对C++无效
在文件 src/native/common/jp_javaenv_autogen.cpp 中包含的内容:
src/native/common/include/jpype.h:45:17: 错误: jni.h: 没有那个文件或目录
在文件 src/native/common/jp_javaenv_autogen.cpp 中包含的内容:
src/native/common/include/jpype.h:77: 错误: ISO C++禁止声明‘jchar’没有类型
src/native/common/include/jpype.h:77: 错误: 在‘’标记之前预期‘,’或‘...’
src/native/common/include/jpype.h:82: 错误: ISO C++禁止声明‘jchar’没有类型
src/native/common/include/jpype.h:82: 错误: 在‘
’标记之前预期‘;’
src/native/common/include/jpype.h:86: 错误: ISO C++禁止声明‘jchar’没有类型
src/native/common/include/jpype.h:86: 错误: 在‘&’标记之前预期‘;’
src/native/common/include/jpype.h:88: 错误: 在‘private’之前预期‘;’
src/native/common/include/jpype.h:89: 错误: ISO C++禁止声明‘jchar’没有类型
src/native/common/include/jpype.h:89: 错误: 在‘*’标记之前预期‘;’
在文件 src/native/common/include/jpype.h:96 中包含的内容:
并且这是结束部分:
src/native/common/include/jp_monitor.h:27: 错误: ‘jobject’没有命名类型
src/native/common/jp_javaenv_autogen.cpp:30: 错误: ‘jbyte’没有命名类型
src/native/common/jp_javaenv_autogen.cpp:38: 错误: ‘jbyte’没有命名类型
src/native/common/jp_javaenv_autogen.cpp:45: 错误: 变量或字段‘SetStaticByteField’声明为void
src/native/common/jp_javaenv_autogen.cpp:45: 错误: ‘jclass’在此作用域中未声明
src/native/common/jp_javaenv_autogen.cpp:45: 错误: ‘jfieldID’在此作用域中未声明
src/native/common/jp_javaenv_autogen.cpp:45: 错误: ‘jbyte’在此作用域中未声明
错误: 命令 'gcc' 失败,退出状态为 1

3 个回答

1

编辑一下Setup.py文件,把/EHsc这个选项去掉。

1
gcc: /EHsc: No such file or directory error: command 'gcc' failed with exit status 1

EHsc是一个特定于微软工具链的编译器开关,这就是你遇到这个错误的原因。你可能在某个地方混用了不同的工具链,或者是之前尝试留下的文件还在?我得自己下载JPype来确认用mingw32编译是否可行。

你知道其实可以下载适用于Python 2.6和Python 2.5的JPype二进制发行版吗?

至于你的*NIX构建,你缺少Java/JNI的开发头文件,所以C语言的Java类型无法使用,编译器也无法识别它们。你需要安装开发包,并确保你的工具链能够找到这些文件。

3

我在Linux上也遇到了同样的错误。对我来说,只需要执行一下

export JAVA_HOME=/usr/lib/[*your_java_folder*]

看看setup.py文件的第45行:

def setupLinux(self):        
self.javaHome = os.getenv("JAVA_HOME")
if self.javaHome is None :
    self.javaHome = '/usr/lib/jvm/java-1.5.0-sun-1.5.0.08' # Ubuntu linux

撰写回答