2014-01-08 25 views
3

我想要一個非常簡單的例子使用JPype(版本: 0.5.4.6)從Python內實例化一個自定義Java類。它 鬆散如下的例子: http://hustleplay.wordpress.com/2010/02/18/jpype-tutorial/並 有關: JPype Headaches使用與JPype自定義Java類:包不可調用錯誤

這裏的Python代碼(在/Users/me/jpypeTest/testjpype.py):

from jpype import * 
cpopt="-Djava.class.path=%s" % ("/Users/me/jpypeTest") 
startJVM(getDefaultJVMPath(),"-ea",cpopt) 
print "JVM path:",getDefaultJVMPath() 
print "classpath:",cpopt 
java.lang.System.out.println("Hello World!!") 
testPkg = JPackage('pkg') 
Test = testPkg.Test 
Test.speak("hi") 
shutdownJVM() 

和這裏的java的代碼(在/Users/me/jpypeTest/pkg/Test.java):

package pkg; 
public class Test { 
    private String msg; 

    public Test() { 
     msg = "nothing so far..."; 
    } 

    public static void speak(String msg) { 
     System.out.println(msg); 
    } 
} 

編譯使用:

javac Test.java 

生產/Users/me/jpypeTest/pkg/Test.class沒有錯誤 (我也曾嘗試把中的Test.class工作目錄)

運行Python代碼給出:

> python testjpype.py 
JVM path: /System/Library/Frameworks/JavaVM.framework/JavaVM 
classpath: -Djava.class.path=/Users/me/jpypeTest 
Hello World!! 
Traceback (most recent call last): 
    File "testjpype.py", line 9, in <module> 
    Test.speak("hi") 
    File "/Users/me/dev/lib/python2.7/site-packages/jpype/_jpackage.py", line 53, in __call__ 
    raise TypeError, "Package "+self.__name+" is not Callable" 
TypeError: Package pkg.Test.speak is not Callable 

系統運行小牛與Mac:

> java -version 
java version "1.7.0_45" 
Java(TM) SE Runtime Environment (build 1.7.0_45-b18) 
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode) 

> javac -version 
javac 1.7.0_45 

> python --version 
Python 2.7.5 

> python -c 'import sys;print("%x" % sys.maxsize, sys.maxsize > 2**32)' 
('7fffffffffffffff', True) 

上市導入Java類的JPype方法也將是非常有用

非常感謝您看到這個!

+0

你有解決這個問題嗎? – Sankalp

+0

恐怕不是,很久以前放棄 –

回答

1

問題似乎是,當您真正需要的是JClass時,訪問JPackage類的屬性會返回一個JPackage類。改變testjpype.py這個工作對我來說:

from jpype import * 
cpopt="-Djava.class.path=%s" % ("/Users/me/jpypeTest") 
startJVM(getDefaultJVMPath(),"-ea",cpopt) 
java.lang.System.out.println("Hello World!!") 
Test = JClass('pkg.Test') 
Test.speak("hi") 
shutdownJVM() 
+0

讚賞。我不能再驗證了,因爲我問了原始問題的時間太長了。 –