Can't load native shared library with dependencies in a native activity app

后端 未结 4 1931
心在旅途
心在旅途 2020-12-15 00:19

In my Android app I have 4 libraries:

libTemplate.so
   depends on libPorkholt.so
libPorkholt.so
   depends on libpng15.so
   depends on liblua.so
   depends         


        
4条回答
  •  时光取名叫无心
    2020-12-15 01:22

    Since apparently Android isn't smart enough to set a LD_LIBRARY_PATH correctly, I managed to solve my problem by creating a small bootstrapper library that manually loads the actual activity. Here's the code:

    #include 
    #include 
    #include 
    #include 
    #include 
    
    #define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "Porkholt", __VA_ARGS__))
    #define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, "Porkholt", __VA_ARGS__))
    
    #define LIB_PATH "/data/data/@PH_BUNDLE_ID@/lib/"
    
    void * load_lib(const char * l)
    {
        void * handle = dlopen(l, RTLD_NOW | RTLD_GLOBAL);
        if (!handle)
        {
            LOGE("dlopen(\"%s\"): %s", l, strerror(errno));
            exit(1);
        }
        return handle;
    }
    
    void ANativeActivity_onCreate(ANativeActivity * app, void * ud, size_t udsize)
    {
        LOGI("Loaded bootstrap");
        load_lib(LIB_PATH "libpng15.so");
        load_lib(LIB_PATH "liblua.so");
        load_lib(LIB_PATH "libopenal.so");
        load_lib(LIB_PATH "libPorkholt.so");
        void (*main)(ANativeActivity*, void*, size_t) = dlsym(load_lib(LIB_PATH "lib@PH_APP_TARGET@.so"), "ANativeActivity_onCreate");
        if (!main)
        {
            LOGE("undefined symbol ANativeActivity_onCreate");
            exit(1);
        }
        main(app, ud, udsize);
    }
    

提交回复
热议问题