2012-11-30 9 views
3

파이썬에서 액세스하려고하는 java facade 클래스가 있으므로 JPype을 사용하기로 결정했습니다. 내 외관 클래스는 내가 클래스의 새 인스턴스를 초기화 할 때 유형이 올바른지 얻이 수없는 것 사 개 인수JPype 자바에 args 전달하기

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

하나의 생성자 (기본값 없음)가 있습니다. 내가 JPype가 작동 알고

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 

: 나는 시도 다 같은 오류를 제공합니다. 행운과 함께 올바른 형식으로 데이터를 얻기 위해 여러 조합의 래퍼를 시도했습니다.

관련 코드 :

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

좋은 질문이다. 앞에서 말했듯이 JPype의 Java 인터페이스 처리 방법 인 JProxy로 구현하는 것뿐만 아니라 래퍼 (예 :'Facade (s1, s2, s3, s4)')를 사용하지 않고 여러 가지 작업을 시도했습니다. 누구든지 그 경험이 있으면 알려 주시기 바랍니다. – 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()