2012-07-07 3 views
3

저는 자바 클래스를 파이썬 스크립트에 사용하기 위해 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 시작 파이썬 스크립트

  • , 나는 정말로 무엇을해야할지 모르며, 당신이 나를 도울 수 있기를 바란다. 는

  • 답변

    0

    -XstartOnFirstThread 명령 줄에이하지를 확인해야 정확히 무엇을,

    조반니을 주셔서 감사합니다. 파이썬으로 스레드를 시작하면 아무런 효과가 없지만 문제는 JVM의 스레드에 있습니다. invokeLater도 차이가 없습니다. AWT 실행 루프는 첫 번째 스레드에서 실행해야합니다. 이것은 코코아에만 적용되는 제한 사항이므로 Mac에서이 프로그램을 실행하고 있다고 가정합니다.

    이제 JVM을 시작한 다음 루트 원인 (해당 명령 줄을 생성 한 코드)을 추적하는 데 사용 된 명령 줄을 정확하게 확인하여 문제를 검색해야합니다. JVM은 사용자가 직접 제어 할 수없는 방법으로 시작됩니다.

    +0

    IT는 Jpype 문제입니다. 이렇게하면 AWT를 초기화 할 때 두 번째 스레드에서 AWT가 초기화됩니다. 비록 리눅스 머신에서 코드를 실행할 것이고, 지금부터 MAC OSX를 사용하지는 않을 것입니다. 이것이 문제를 해결할 수 있기를 바랍니다! 감사합니다. – joker

    +0

    AWT 이벤트 루프의 초기화는 클라이언트 코드의 제어 밖에 있습니다. AWT 객체를 사용하는 스레드는 중요하지 않습니다. 따라서이 오류의 유일한 이유는 RunOnFirstThread입니다. 그것은 Jpype의 문제처럼 들립니다. –

    1

    이 매개 변수를 사용하여 : 내가 JVM을 초기화하는 코드를 읽고, 그것은 파이썬 클래스로 전달하기 전에 자바 스레드를 실행 : 제 생각에는

    jpype.startJVM(jpype.getDefaultJVMPath(), '-Djava.awt.headless=true')