2017-02-27 9 views
-2

나는이 질문에 대한 답을 찾기 위해 열심히 노력했지만 마침내 발견되었지만 stackoverflow가 아니기 때문에 질문과 대답을 모두 복제하도록 결정했습니다. 아마도 누군가가 필요합니다. 그것도.Groovy Java OpenCV 바인딩 (JNI)

매우 간단한 Groovy/OpenCV 예제를 설정했지만 java.lang.UnsatisfiedLinkError가 발생합니다. 이로 인해 알지 못했던 Groovy와 Java 간의 상호 운용성 문제가 드러났습니다.

import org.opencv.core.Core 
import org.opencv.core.CvType 
import org.opencv.core.Mat 

class Main { 
    static { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); } 

    public static void main(String[] args) { 
     Mat m = Mat.eye(3, 3, CvType.CV_8UC1); 
     System.out.println("m = " + m.dump()); 
    } 
} 

는하지만 자바에서 동일한 코드를 완벽하게 실행됩니다.

import org.opencv.core.Core; 
import org.opencv.core.CvType; 
import org.opencv.core.Mat; 

public class OtherMain { 
    static { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); } 

    public static void main(String[] args) { 
     Mat m = Mat.eye(3, 3, CvType.CV_8UC1); 
     System.out.println("m = " + m.dump()); 
    } 
} 

답변

0

그래서 수정 사항은 무엇입니까? 수정 사항에는 Groovy가 Java와 같은 패키지 전용 메소드를 기본적으로 갖고 있지 않다는 사실을 이용합니다. 그루비 대신에 어노테이션 @PackageScope을 사용해야합니다. 그러나 그루비 런타임은 실제로 Java 코드를 Groovy 코드로 해석하기 때문에 기본적으로 Groovy에서는 Java의 패키지 개인 메소드가 공개됩니다. 그러나 그 전부는 아니며 심지어 비공개 Java 메소드조차도 Groovy에 쉽게 액세스 할 수 있으며 Groovy에서는 잘 알려진 문제입니다. GROOVY-1875

import org.opencv.core.Core 
import org.opencv.core.CvType 
import org.opencv.core.Mat 

class Main { 
    static { 
     Runtime.getRuntime().loadLibrary0(groovy.lang.GroovyClassLoader.class, Core.NATIVE_LIBRARY_NAME) 
    } 

    public static void main(String[] args) { 
     Mat m = Mat.eye(3, 3, CvType.CV_8UC1); 
     System.out.println("m = " + m.dump()); 
    } 
}