Android - доступ к собственным функциям в предварительно скомпилированной библиотеке

Я хотел бы использовать встроенную функцию OpenCV getThreshVal_Otsu_8u в моем приложении для Android. Я заметил, что внешние функции-оболочки Java OpenCV вызывают функции, определенные как native, но которые не имеют тех же имен, что и настоящие собственные функции. Например:

Java функция:

double threshold(Mat src, Mat dst, double thresh, double maxval, int type)

Java "родная" функция:

private static native double threshold_0(long src_nativeObj, long dst_nativeObj, double thresh, double maxval, int type)

C++ функция:

double cv::threshold( InputArray _src, OutputArray _dst, double thresh, double maxval, int type )

Как я могу сделать подобное native Java-функция для вызова getThreshVal_Otsu_8u? Есть ли способ избежать перестройки библиотек OpenCV и просто "туннелировать" в существующую .lib файлы?

1 ответ

Решение

Если это еще не так, вам сначала нужно настроить свой проект Android, чтобы использовать собственный интерфейс Java ( эта ссылка может помочь).

Как только он настроен, принцип довольно прост:

  • Вам необходимо создать собственный прототип Java в вашем коде Java (например, public native void yourFunction();)
  • Соответствующая функция должна быть определена в вашем файле C/C++ (например, JNIEXPORT void JNICALL Java_your_package_JavaClassName_yourFunction(JNIEnv * env, jobject obj);)
  • Вы должны иметь возможность включить библиотеку OpenCV в ваш код C/C++ (например, #include <opencv2/core/core.hpp>)

Метод, который вы хотите использовать (т.е. getThreshVal_0tsu_8u) занимает Mat& в качестве параметра и возвращает double, что означает, что вам нужно будет соответственно адаптировать свой jni-код.

Другие вопросы по тегам