2017-02-27 59 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()); 
    } 
} 

但在Java中相同的代碼運行完全。

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這樣的包私有方法的事實。相反,在Groovy中,您將不得不使用註釋@PackageScope。但Groovy Runtime實際上將Java代碼解釋爲Groovy代碼,因此默認情況下,Java的包私有方法在Groovy中是公共的。但這還不是全部,Groovy甚至可以輕鬆訪問私有Java方法,這是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()); 
    } 
}