Jpype中找不到类错误

4 投票
2 回答
4422 浏览
提问于 2025-04-18 05:41

我在Stack Overflow上看了很多内容,也搜索了很多信息。我还找到了一篇关于JPype类未找到的问题,虽然那篇文章解决了问题,但对我没有帮助!我也遇到了同样的问题!我在用Mac,Python版本是2.7.6。

我的Python代码和A.java文件都在桌面上。但是我一直收到这个错误:

错误追踪(最近的调用在最前面): 文件 "/Users/jeren/Desktop/aa.py",第13行,内容是 A = jpype.JClass("A") 文件 "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/jpype/_jclass.py", 第54行,内容是 JClass 抛出 _RUNTIMEEXCEPTION.PYEXC("类 %s 未找到" % name) java.lang.ExceptionPyRaisable: java.lang.Exception: 类 A 未找到

aa.py 的内容是: import jpype

import os

jpype.startJVM(jpype.getDefaultJVMPath(), "-ea", "-Djava.class.path=/Users/jeren/Desktop/")

A = jpype.JClass("A")

a = A()

jpype.shutdownJVM()

A.java 的内容是:

class A

{

    public A()

    {

        super();

    }

    public String sayHi()

    {

        return("Hello");

    }



    public static void main(String[] argv)

    {

        System.out.println ("Hello ");

    }



    public static int add(int a, int b)

    {

        return(a+b);

    }

}

我的Mac、Java和Python都是64位的!那问题可能出在哪里呢?

2 个回答

0

下面是关于为jpype指定类路径的一些补充说明。

A. 检查JDK路径

我安装了多个版本的Java JDK,但使用getDefaultJVMPath时没有得到预期的路径。我需要把

jpype.getDefaultJVMPath()

替换成实际用来编译代码的JDK路径,比如说:

D:/jdk11/bin/server/jvm.dll

B. 相对路径

可以使用相对路径。如果我的Python文件在一个名为“pkg”的文件夹里,而我的Java类文件在“bin”文件夹的子文件夹“foo”里:

parentFolder

  • pkg/main.py
  • bin/foo/Foo.class

    jpype.startJVM(jvmPath, '-Djava.class.path=../bin')

    link = jpype.JClass('foo.Foo')

在这个例子中,Java应用程序的工作目录是pkg文件夹。换句话说,在Foo类的main方法里,你可能需要用“../”来访问parentFolder。

C. -cp选项不起作用

我尝试使用-cp选项来代替-Djava.class.path,这样我觉得更直观。然而,下面的代码并不奏效:

jpype.startJVM(jvmPath, '-cp', classPath)

D. 每个jar文件需要单独包含

我尝试包含一个包含多个jar文件的文件夹。

parentFolder

  • foo/main.py
  • lib/foo.jar

下面的代码不起作用:

jpype.startJVM(jvmPath, '-Djava.class.path=../lib/*")
link = jpype.JClass('foo.Foo')

每个jar文件需要单独包含,比如:

libOath = '../lib'
libJarPaths = str.join(';', [libPath + '/' + name for name in os.listdir(libPath)])
jpype.startJVM(jvmPath, '-Djava.class.path=../lib/*")
link = jpype.JClass('foo.Foo')

(解决方案来自 JPype (Python): 导入jar文件夹)

1

一切都没问题,只需要在类A的开头加一个'public':

    public class A
    {       
        public A()       
        {
            super();
        }
        public String sayHi()

        {
            return("Hello");
        }

撰写回答