Как я могу вызвать функцию / метод из .so файла в Android-студии - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь внедрить ffmpeg в мое приложение для Android.У меня уже есть готовые .so файлы, которые мне нужны.

Я просто не могу понять, как вызвать одну из многих функций в библиотеке.Вот что у меня есть:

Я поместил каждый из файлов .so в папку jniLibs enter image description here

Здесьмой файл gradle Here is my gradle file

Оттуда я загружаю библиотеку так:

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)

С этими изменениями результат тот же.

1 Ответ

0 голосов
/ 17 октября 2018

Вы должны сконфигурировать среду для использования классов c / c ++.Вам нужен CMakeLists.txt или Android.mk / Application.mk.

Затем вам нужно создать класс для связывания класса java и нативного класса.

Эта ссылка могла быпомочь вам.

Как говорится в сообщениях об ошибках, jint Java_{PACKAGE_NAME}_{CLASS_NAME}_{FUNCTION_NAME}(JNIEnv *env, jobject obj) необходимо.И вы можете вызвать avdevice_version() внутри функции.

Обновление

В Android.mk сначала создайте предварительно собранную общую библиотеку, а затем создайте ссылку на общую библиотеку

include $(CLEAR_VARS)
LOCAL_MODULE := static_avdevice # you can change the name
LOCAL_SRC_FILES = avdevice.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include # header file directory
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include # header file directory
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := jniLinker
LOCAL_SRC_FILES := video.c
LOCAL_STATIC_LIBRARIES := static_avdevice
include $(BUILD_SHARED_LIBRARY)

Затем загрузите библиотеку.System.loadLibrary("jniLinker");

И, в googlesamples github много образцов.https://github.com/googlesamples/android-ndk/tree/master/hello-libs Это пример кода для использования сторонней библиотеки.(Но он использует CMake.)

...