【问题标题】:JPype Passing args to JavaJPype 将 args 传递给 Java
【发布时间】:2012-11-18 05:23:59
【问题描述】:

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

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()

【问题讨论】:

  • 我不知道 python 或 jpype 的东西,但是:你确定 JArray(JString) 是 List&lt;String&gt; 的正确东西吗?在我看来,它代表 String[]
  • 好问题。正如我所说,我尝试了几件事,包括没有包装器的它(例如Facade(s1,s2,s3,s4))以及用JPype处理java接口的JProxy实现一些东西。如果有人有这方面的经验,请告诉我。
  • @bnjmn 您能否分享一个使用 Jpype 从 Python 执行 jar 的类函数的工作示例。我找不到工作样本,尝试了几个选项但失败并出现错误“不可调用”

标签: java python jpype


【解决方案1】:

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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多