2012-11-30 85 views
3

我有一個java門面類我試圖從python訪問,所以我決定使用JPype。我的門面類只有一個構造函數(無默認值)四ARGSJPype將參數傳遞給Java

public facade(String a, String b, List<String> c, List<String> d){ 
    ... 
} 

我似乎無法初始化類的新實例時,爲了獲得正確的類型。我所嘗試的一切給出了相同的錯誤:

File ".../main.py", line 34, in __init__ 
    facadeinstance = Facade(jpype.JString(s1), jpype.JString(s2),jpype.JArray(jpype.java.lang.String, 1)(s3), jpype.JArray(jpype.java.lang.String, 1)(s4)) 
File "/usr/local/lib/python2.7/dist-packages/jpype/_jclass.py", line 79, in _javaInit 
    self.__javaobject__ = self.__class__.__javaclass__.newClassInstance(*args) 
RuntimeError: No matching overloads found. at src/native/common/jp_method.cpp:121 

我知道JPype正在工作。我已經嘗試了幾種包裝的組合,以正確的形式獲取數據,但沒有運氣。

相關代碼:

import jpype 

s1 = "something" 
s2 = "something else" 
s3 = ["something in a list"] 
s4 = ["Something else in a list"] 

jpype.startJVM(jpype.getDefaultJVMPath(), "-Djava.class.path=" + JavaJarDir) 
myLib = jpype.JPackage('myLib') 
Facade = myLib.Facade # class loads fine, resources printed to stdout 
# The error occurs on the next line 
FacadeInstance = Facade(jpype.JString(s1), jpype.JString(s2), jpype.JArray(jpype.java.lang.String, 1)(s3), jpype.JArray(jpype.java.lang.String, 1)(s4)) 
jpype.shutdownJVM() 
+0

我不知道蟒蛇或jpype的事情,但:你確定'JArray(的jstring)'是正確的事情'清單'?聽起來像它會代表'String []' – zapl

+0

好問題。正如我所說的,我嘗試了幾個東西,包括沒有包裝的東西(例如'Facade(s1,s2,s3,s4)'),以及用JPype處理java接口的方式實現了一些東西。如果有人有這方面的經驗,請讓我知道。 – bnjmn

+0

@bnjmn您可以使用Jpype來分享一個從Python執行jar類的函數的工作示例。我無法找到一個工作示例,嘗試了幾個選項但失敗,出現錯誤「不可調用」 – Sankalp

回答

5

JArray(的jstring)將不會匹配列表。你必須使用jpype.java.util.ArrayList()(或實現List的任何東西)。

myArray = ["A", "B", "C"] 
myList = jpype.java.util.ArrayList() 
for s in myArray: 
    myList.add(s) 

所以,你的代碼將看起來像:

import jpype 

s1 = "something" 
s2 = "something else" 
s3 = ["something in a list"] 
s4 = ["Something else in a list"] 

jpype.startJVM(jpype.getDefaultJVMPath(), "-Djava.class.path=" + JavaJarDir) 

# Import Java library and class 
myLib = jpype.JPackage('myLib') 
Facade = myLib.Facade 

# Prepare List<String> arguments 
arg3 = jpype.java.util.ArrayList() 
for s in s3: 
    list3.add(s) 
arg4 = jpype.java.util.ArrayList() 
for s in s4: 
    list4.add(s) 

FacadeInstance = Facade(jpype.JString(s1), jpype.JString(s2), arg3, arg4) 

jpype.shutdownJVM()