ExceptionInInitializerError в Stitcher с JavaCV для Android
Я использую этот код для сшивания изображений с JavaCV на Android:
public void ImageStitching() {
Stitcher stitcher = Stitcher.createDefault(false);
MatVector images = new MatVector(2);
images.put(0,cvLoadImage("sample1.png"));
images.put(1,cvLoadImage("sample2.png"));
IplImage result = new IplImage(null);
int status = stitcher.stitch(images,result);
if( status == Stitcher.OK )
{
cvSaveImage("result.png", result);
}
}
Но когда я его выполняю, приложение вылетает и в журнале появляется следующая ошибка:
java.lang.ExceptionInInitializerError at ...
и ошибка указывает на инициализацию Stitcher, первую строку моего кода. Если я попытаюсь сделать Stitcher stitcher;
это не ломается, но я больше ничего не могу сделать, так как брошюровщик не инициализирован. Если я попытаюсь инициализировать его null
он вылетает с той же ошибкой.
Есть идеи о проблеме? Я искал некоторое время, и все люди используют это, и это, кажется, работает.
2 ответа
Ладно, я понял.
Проблема была в том, что библиотека opencv_stitching.so была только в папке armeabi, а мне нужна была в armeabi-v7a. Не могу объявить брошюровщик и инициализировать его.
ExceptionInInitializerError
Сигналы о том, что в статическом инициализаторе произошло непредвиденное исключение. ExceptionInInitializerError генерируется, чтобы указать, что исключение произошло во время оценки статического инициализатора или инициализатора для статической переменной.
Я бы сделал что-то вроде
Stitcher stitcher;
{
try {
stitcher = Stitcher.createDefault(false);
} catch (Throwable t) {
t.printStackTrace();
throw t;
}
}
и посмотрите, что на самом деле происходит - если только вы уже не располагаете этой информацией в пункте " вызвано оператором" трассировки исключений.
PS иногда возникают ошибки, когда класс инициализируется не в том потоке (например, в ранних версиях Android класс AsyncTask требовал явной инициализации основного потока в приложении, которое в противном случае загружало бы этот класс в рабочий поток).