Ошибка dlopen (возврат NULL) при добавлении SDL2 в проект Android - PullRequest
2 голосов
/ 23 апреля 2019

Я добавляю SDL2.0.9 в мой проект Android с cmake3.6 (NDK19) на Android Studio3.4, и я получил эту ошибку:

" E/SDL: nativeRunMain(): Couldn't load library /data/app/org.libsdl.app-eOed871MljqNS6cZDl_DBg==/lib/arm64/libmain.so"

После отладки я обнаружил эту строку ( library_handle равен NULL ) в SDL2 / src / core / androd / SDL_android.c :

library_handle = dlopen(library_file, RTLD_GLOBAL);
if (library_handle) {
...
} else {
        __android_log_print(ANDROID_LOG_ERROR, "SDL", "nativeRunMain(): Couldn't load library %s", library_file);
}

Ниже мой CMakeLists.txt :

cmake_minimum_required(VERSION 3.4.1)

file(GLOB my_source ${CMAKE_SOURCE_DIR}/*.cpp ${CMAKE_SOURCE_DIR}/*.c)

add_library(main
        SHARED
        main.cpp)

include_directories(${CMAKE_SOURCE_DIR}/include)

add_subdirectory(${CMAKE_SOURCE_DIR}/SDL2)
include_directories(${CMAKE_SOURCE_DIR}/SDL2/include)

find_library(log-lib
        log)

target_link_libraries(
        main
        SDL2
        GLESv1_CM
        GLESv2
        -landroid
        ${log-lib})

и мой main.cpp :

#include <android/log.h>

#define LOG_TAG "gmyffplay"
#define LOGV(...) ((void)__android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__))
#define LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__))
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__))
#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__))
#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__))

#include "SDL.h"

extern "C" {

int main(int argc, char *argv[]) {

    char *video_path = argv[1];
    LOGI("video_path  : %s", video_path);

    SDL_Window *window;
    SDL_Renderer *renderer;
    SDL_Event event;

    if (SDL_Init(SDL_INIT_VIDEO) < 0) {
        LOGE("Could not initialize SDL - %s", SDL_GetError());
        return 1;
    }

    window = SDL_CreateWindow("SDL_Window", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 0, 0,
                              SDL_WINDOW_SHOWN);
    renderer = SDL_CreateRenderer(window, -1, 0);
    SDL_Surface *bmp = SDL_LoadBMP("image.bmp");
    SDL_SetColorKey(bmp, SDL_TRUE, 0xffffff);
    SDL_Texture *texture = SDL_CreateTextureFromSurface(renderer, bmp);
    SDL_FlushEvents(SDL_FIRSTEVENT, SDL_LASTEVENT);
    while (1) {
        if (SDL_PollEvent(&event)) {
            if (event.type == SDL_QUIT) {
                break;
            }
        }
        SDL_SetRenderDrawColor(renderer, 0, 133, 119, 255);
        SDL_RenderClear(renderer);
        SDL_RenderCopy(renderer, texture, NULL, NULL);
        SDL_RenderPresent(renderer);
    }
    SDL_FreeSurface(bmp);
    SDL_DestroyTexture(texture);
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();
    return 0;
}
}

Я уверен, что файл library_file существует, libmain.so в apk и libSDL2 загружается до libmain.so.

Кто-нибудь, помогите мне, будет благодарен

редактировать:

это моя proj архитектура

enter image description here

Ответы [ 2 ]

2 голосов
/ 14 мая 2019

Я нашел решение проблемы android-ndk github , похоже, возникла проблема с поиском библиотеки для динамического связывания библиотеки libdl.so , где dlopen функция объявлена.

Так что вам нужно изменить:
find_library(ANDROID_DL_LIBRARY dl) до
find_library(ANDROID_DL_LIBRARY NAMES libdl.so dl) in SDL2 / CMakeLists.txt

1 голос
/ 27 апреля 2019

Пока я нашел только одно решение: понизить NDK до r18b (r19c - не работает). И dlopen начать загрузку библиотеки. Я не могу выяснить, что именно произошло, курс dlerror всегда возвращает (ноль) независимо от того, что я пытаюсь загрузить разделяемую библиотеку из другой разделяемой библиотеки. Вы можете найти старую версию ndk здесь: https://developer.android.com/ndk/downloads/older_releases.html загрузить и распаковать, а затем добавить в ваш файл local.properties:

ndk.dir=/home/<your_path>/android-ndk-r18b
...