私のMacでコードを実行する際に問題が発生します。誰かが私に画像分析を書いていたJava appですが、netbeansで実行しようとするとこのエラーが発生し続けます。
実行:スレッド「メイン」の例外Java.lang.UnsatisfiedLinkError:Java.lang.Runtime.loadLibrary0(Runtime.Java: 870)at Java.lang.System.loadLibrary(System.Java:1119)at image.prossing.Test.main(Test.Java:28)Java Result:1 BUILD SUCCESSFUL(合計時間) :0秒)
Netbeansプロジェクトを用意し、必要なjarファイルをライブラリーとして追加します。プログラマーは、正しいOpenCVバージョンをダウンロードし、opencv.dllファイルをJava/jre/binフォルダーにコピーするように言った。しかし、dllファイルまたはJava/jreフォルダーが見つかりません。私はほとんどのプログラミングが理由でウィンドウで起こることを知っています。誰かが私がこの問題を解決し、このアプリケーションを私のMacで実行するのを手伝ってくれることを願っています。
以下は、コードの最初の部分で、おそらくエラーを引き起こしている部分です。
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package image.prossing;
/**
*
* @author Dumith Salinda
*/
import Java.util.ArrayList;
import Java.util.List;
import org.opencv.core.Core;
import static org.opencv.core.Core.FONT_HERSHEY_SIMPLEX;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;
public class Test {
public static void main(String[] args) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
明確でない場合は申し訳ありませんが、不足している場合や不明な場合に追加する情報をお知らせください。あなたができるどんな助けでも本当に感謝します。よろしくお願いします
OpenCVディレクトリを調べます。
たとえば、これ; (brew install opencv3 --with-Java --with-python3
を使用してインストール)
/usr/local/Cellar/opencv3/XXX/share/OpenCV/Java
表示されます。
libopencv_javaXXX.so opencv-XXX.jar
すでにOpenCVのJava(libopencv_javaXXX.so
)のネイティブライブラリがコンパイルされているので、唯一残っているのはmac動的ライブラリ。
libopencv_javaXXX.so
をlibopencv_javaXXX.dylib
にリンクします。
ln -s libopencv_javaXXX.so libopencv_javaXXX.dylib
/usr/local/Cellar/opencv3/XXX/share/OpenCV/Java
をネイティブライブラリの場所 inIntelliJまたはEclipseの類似のものとして追加します。
または、これをJVM引数に追加します。
-Djava.library.path=/usr/local/Cellar/opencv3/XXX/share/OpenCV/Java
OSX Yosemiteを実行しているMacで、libopencv_Java2412.dylibファイルを/Library/Java/Extensions
にドロップし、機能しました。
Opencvをビルドすると、libopencv_Java2412.dylibが/ build/libに生成されます。
多くの時間を費やし、StackOverflowからのさまざまな提案を使用した後、私は何とかWindows向けのソリューションを手に入れました。しかし、私は同様にMac用のソリューションを追加しています。それが機能することを願っています。
システム構成に従ってlibをロードします。
private static void loadLibraries() {
try {
InputStream in = null;
File fileOut = null;
String osName = System.getProperty("os.name");
String opencvpath = System.getProperty("user.dir");
if(osName.startsWith("Windows")) {
int bitness = Integer.parseInt(System.getProperty("Sun.Arch.data.model"));
if(bitness == 32) {
opencvpath=opencvpath+"\\opencv\\x86\\";
}
else if (bitness == 64) {
opencvpath=opencvpath+"\\opencv\\x64\\";
} else {
opencvpath=opencvpath+"\\opencv\\x86\\";
}
}
else if(osName.equals("Mac OS X")){
opencvpath = opencvpath+"Your path to .dylib";
}
System.out.println(opencvpath);
System.load(opencvpath + Core.NATIVE_LIBRARY_NAME + ".dll");
} catch (Exception e) {
throw new RuntimeException("Failed to load opencv native library", e);
}
}
2.必要に応じてこの方法を使用します
public static void main(String[] args) {
loadLibraries();
}
過酷なVakhariaのビルド answer Macポートを使用してMacにOpenCVをインストールしようとしました。
Sudo port install opencv +Java
ls /opt/local/share/OpenCV/Java
libopencv_Java343.dylib opencv-343.jar
このライブラリを使用するには、実行時にライブラリパスを変更できることを望んでいました。
そして、次のヘルパークラスと単体テストになりました。コードは現在、
Self Driving RC-Car open source 私がコミッターであるプロジェクト。
JUnitテスト
/**
* @see <a href=
* 'https://stackoverflow.com/questions/27088934/unsatisfiedlinkerror-no-opencv-Java249-in-Java-library-path/35112123#35112123'>OpenCV
* native libraries</a>
* @throws Exception
*/
@Test
public void testNativeLibrary() throws Exception {
if (debug)
System.out.println(String.format("trying to load native library %s",
Core.NATIVE_LIBRARY_NAME));
assertTrue(NativeLibrary.getNativeLibPath().isDirectory());
assertTrue(NativeLibrary.getNativeLib().isFile());
NativeLibrary.load();
}
NativeLibrary
package com.bitplan.opencv;
import Java.io.File;
import Java.lang.reflect.Field;
import Java.util.Arrays;
import org.opencv.core.Core;
/**
* load OpenCV NativeLibrary properly
*/
public class NativeLibrary {
protected static File nativeLibPath = new File("../lib");
/**
* get the native library path
*
* @return the file for the native library
*/
public static File getNativeLibPath() {
return nativeLibPath;
}
/**
* set the native library path
*
* @param pNativeLibPath
* - the library path to use
*/
public static void setNativeLibPath(File pNativeLibPath) {
nativeLibPath = pNativeLibPath;
}
/**
* get the current library path
*
* @return the current library path
*/
public static String getCurrentLibraryPath() {
return System.getProperty("Java.library.path");
}
/**
* Adds the specified path to the Java library path
*
* @param pathToAdd
* the path to add
* @throws Exception
* @see <a href=
* 'https://stackoverflow.com/questions/15409223/adding-new-paths-for-native-libraries-at-runtime-in-Java'>Stackoverflow
* question how to add path entry to native library search path at
* runtime</a>
*/
public static void addLibraryPath(String pathToAdd) throws Exception {
final Field usrPathsField = ClassLoader.class.getDeclaredField("usr_paths");
usrPathsField.setAccessible(true);
// get array of paths
final String[] paths = (String[]) usrPathsField.get(null);
// check if the path to add is already present
for (String path : paths) {
if (path.equals(pathToAdd)) {
return;
}
}
// add the new path
final String[] newPaths = Arrays.copyOf(paths, paths.length + 1);
newPaths[newPaths.length - 1] = pathToAdd;
usrPathsField.set(null, newPaths);
}
public static File getNativeLib() {
File nativeLib = new File(getNativeLibPath(),
"lib" + Core.NATIVE_LIBRARY_NAME + ".dylib");
return nativeLib;
}
/**
* load the native library by adding the proper library path
*
* @throws Exception
* - if reflection access fails (e.g. in Java9/10)
*/
public static void load() throws Exception {
addLibraryPath(getNativeLibPath().getAbsolutePath());
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}
}
以下のコード行から例外が発生しています:
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
プログラムは、loadLibrary
メソッドの呼び出しで引数の名前でネイティブライブラリをロードしようとしていますが、それを見つけることができません。ネイティブライブラリ(opencv.dll)がJava.library.path
システムプロパティにある場所のいずれかに配置されていることを確認してください。JVMはこれらの場所を見てネイティブライブラリ( 'Java/jre/bin'を含まない)をロードします。
次のようにプログラムでJava.library.path
を印刷できます。
System.out.println(System.getProperty("Java.library.path"));
Windowsライブラリ(dll
ファイル)をMacに配置して実行することはできません。最初にMac用のライブラリをコンパイルする(またはMacバージョンのライブラリを取得する)必要があります。
方法のヒントについては、こちらをご覧ください。