Я пытаюсь внедрить ffmpeg в мое приложение для Android.У меня уже есть готовые .so файлы, которые мне нужны.
Я просто не могу понять, как вызвать одну из многих функций в библиотеке.Вот что у меня есть:
Я поместил каждый из файлов .so в папку jniLibs ![enter image description here](https://i.stack.imgur.com/1GH1Q.png)
Здесьмой файл gradle ![Here is my gradle file](https://i.stack.imgur.com/Cezyy.png)
Оттуда я загружаю библиотеку так:
static {
Log.e("jni", "starting");
System.loadLibrary("avdevice");
Log.e("jni", "finished");
}
Она загружается успешно.Все идет нормально.
Затем я смотрю на файл .h, чтобы найти методы, которые я могу вызвать.Обратите внимание, я предполагаю, что этот файл .h включен в файл .so.Это может быть, где все это разваливается.
/**
* Return the LIBAVDEVICE_VERSION_INT constant.
*/
unsigned avdevice_version(void);
Поскольку теперь я знаю имя метода, который мне нужно вызвать, я помещаю его в свой код:
public native int avdeviceVersion();
Когда я пытаюсь позвонить avdeviceVersion();
, я получаю это сообщение об ошибке:
java.lang.UnsatisfiedLinkError: No implementation found for int com.my.app.ApplicationContext.avdeviceVersion() (tried Java_com_my_app_ApplicationContext_avdeviceVersion and Java_com_my_app_ApplicationContext_avdeviceVersion__)
Теперь я понимаю, что Java_com_my_app_ApplicationContext_avdeviceVersion
не соответствует имени метода в файле .h.Но я не знаю, как это сделать и что делать дальше.Если вы знаете, пожалуйста, объясните это как можно более подробно.Предположим, я ничего не знаю:)
Обновление
Я добавил файл Android.mk, а также Application.mk, я также добавил мост Jni с именем video.c
.
JNIEXPORT jint JNICALL Java_com_my_app_jni_VideoKit_version(JNIEnv *env, jobject instance, jobjectArray args) {
return (*env)->avdevice_version();}
Мой Android.mk такой:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := avdevice
LOCAL_SRC_FILES := video.c
include $(BUILD_SHARED_LIBRARY)
С этими изменениями результат тот же.