저는 자바 클래스를 파이썬 스크립트에 사용하기 위해 Jpype을 사용하고 있습니다. 자바 클래스는 AWT 라이브러리를 사용합니다. 이것은 문제가되는 것 같습니다. Jpype : "Java가 첫 번째 스레드에서 시작 되었기 때문에 AWT를 시작할 수 없습니다."
이 파이썬 스크립트를import jpype
import os.path
import threading
jarpath = os.path.join(os.path.abspath('.'), 'build/jar')
target=jpype.startJVM(jpype.getDefaultJVMPath(), "-Djava.ext.dirs=%s" % jarpath)
Capture = jpype.JClass('Capture') # Capture is the class, contained in ./ folder
t = Capture(50,354,90,90,130,650,"num",36); # create the instance
jpype.shutdownJVM()
그래서 난 그냥 클래스, 그냥 종료를 인스턴스화하기 위해 노력하고있어. 이것은 자바 클래스입니다. 파이썬 스크립트를 실행할 때
class Capture {
public Capture(int x, int y, int width, int height, int mouseNextX, int mouseNextY, final String fnamestart, final int countmax) {
//...
images = new ArrayList<BufferedImage>();
getImages(fnamestart,countmax); //THIS is the problem
}
// reference to getImages() method:
public void getImages(String fname, int countmax) {
images.clear();
for(int i=0; i<=countmax; i++) {
try {
BufferedImage img = ImageIO.read(new File(fname+i+".bmp"));
images.add(img);
} catch(IOException e) {
images.add(null);
}
}
}
}
이 코드는, 나에게 다음과 같은 오류가 발생 : 나는 오류의 원인이되는 코드 만보고있어
jpype._jexception.VirtualMachineErrorPyRaisable: java.lang.InternalError: Can't start
the AWT because Java was started on the first thread. Make sure StartOnFirstThread is
not specified in your application's Info.plist or on the command line
길고도 짧은 이야기,이 알려진 문제입니다 : 이클립스는 "자체 버전"을 가지고 있었지만 해결되었습니다. 불행히도 jpype과 관련된이 문제에 대해 아무도 말하지 않았습니다. JVM이 시작하기 전에 스레드를 실행,
파이썬 스크립트에서 :
나는 일을하지 않았다 이러한 솔루션을 시도했다. 그리고 다른 스레드에서 JVM을 시작합니다.java.awt.EventQueue.invokeLater(new Runnable() { public void run() { images = new ArrayList<BufferedImage>(); getImages(fnamestart,countmax); } });
: 생성자에서 AWT 방법 invokeLater
사용 : 자바 코드
target=jpype.startJVM(jpype.getDefaultJVMPath(), "-XStartOnFirstThread -Djava.ext.dirs=%s" % jarpath)
: 파라미터 -XstartOnFirstThread
으로 JVM 시작 파이썬 스크립트
, 나는 정말로 무엇을해야할지 모르며, 당신이 나를 도울 수 있기를 바란다. 는
IT는 Jpype 문제입니다. 이렇게하면 AWT를 초기화 할 때 두 번째 스레드에서 AWT가 초기화됩니다. 비록 리눅스 머신에서 코드를 실행할 것이고, 지금부터 MAC OSX를 사용하지는 않을 것입니다. 이것이 문제를 해결할 수 있기를 바랍니다! 감사합니다. – joker
AWT 이벤트 루프의 초기화는 클라이언트 코드의 제어 밖에 있습니다. AWT 객체를 사용하는 스레드는 중요하지 않습니다. 따라서이 오류의 유일한 이유는 RunOnFirstThread입니다. 그것은 Jpype의 문제처럼 들립니다. –