首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JPype将参数传递给Java

JPype将参数传递给Java
EN

Stack Overflow用户
提问于 2012-11-30 09:15:20
回答 1查看 6.1K关注 0票数 3

我有一个试图从python访问的java外观类,所以我决定使用JPype。我的facade类只有一个带有四个参数的构造函数(无默认值)

代码语言:javascript
复制
public facade(String a, String b, List<String> c, List<String> d){
    ...
}

在初始化类的新实例时,我似乎不能正确地获取类型。我尝试的所有操作都给出了相同的错误:

代码语言:javascript
复制
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在工作。我尝试了几种包装器的组合,以获得正确形式的数据,但没有成功。

相关代码:

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

发布于 2012-12-14 21:33:02

JArray(JString)与列表不匹配。您必须使用jpype.java.util.ArrayList() (或实现List的任何东西)。

代码语言:javascript
复制
myArray = ["A", "B", "C"]
myList = jpype.java.util.ArrayList()
for s in myArray:
    myList.add(s)

因此,您的代码将如下所示:

代码语言:javascript
复制
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()
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13637614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档