При использовании .so файла android реализация не найдена - PullRequest
1 голос
/ 11 марта 2019

Я хочу использовать нативную библиотеку из другого проекта.вот моя библиотека.so library

я впервые использую ndk в андроид студии.Мне удалось загрузить библиотеку .so, но не удалось, когда я хочу получить доступ к файлу.вот ошибка error description

вот мой код java, который загружает библиотеку.jni

вот мой основной код Java main

Вы можете решить мою проблему?спасибо

Ответы [ 2 ]

0 голосов
/ 11 марта 2019

С ссылкой на пример проекта, который вы указали в комментариях, жизнь становится действительно легкой.

Вам нужен файл https://github.com/CassieLuoli/react-native-smartconnection/blob/master/android/src/main/java/com/mediatek/demo/smartconnection/JniLoader.java as is в вашем проекте. Загрузите его с GitHub, не изменяя имя класса или пакет, и используйте его в своем приложении Java, как они делают в своем примере .

0 голосов
/ 11 марта 2019

Вам не хватает слоя JNI в вашей C-части. Чтобы позволить нативному интерфейсу Java GetLibVersion() найти подходящую функцию в C-части, вам нужно определить имя C-функции с помощью Java_ai_widya_mediatekso_JniLoader_GetLibVersion(JNIEnv *env, jobject thiz), как и сказал журнал аварий. Не пропустите параметры JNI в функции C.
Если вы хотите иметь точно такое же имя функции в части C, что и в части Java, вы можете зарегистрировать новое имя в JVM. Вызовите функцию ниже в вашем JNI_Onload ().

static int registerNativeMethods(JNIEnv* env)
{
    jclass clazz;
    const char* className = "ai/widya/mediatekso/JniLoader";
    clazz = env->FindClass(className);
    if (clazz == NULL) {
        ALOGE("Native registration unable to find class '%s'", className);
        return JNI_FALSE;
    }
    JNINativeMethod methods[] = {
        {"GetLibVersion", "()V", (void*) GetLibVersion },
        {"GetProtoVersion", "()V", (void*) GetProtoVersion },
    };
    if (env->RegisterNatives(clazz, methods, 2) < 0) {
        ALOGE("RegisterNatives failed for '%s'", className);
        return JNI_FALSE;
    }
    return JNI_TRUE;
}

И не забудьте добавить параметры JNI в ваши функции C, как это GetLibVersion(JNIEnv *env, jobject thiz).

...