2013-06-06 2 views
0

Я использую следующий код самонастройки, чтобы загрузить свою нативную активность (jngl-тест):«dlopen: Недопустимый аргумент» при загрузке нативной активности

#include <android/native_activity.h> 
#include <android/log.h> 
#include <dlfcn.h> 
#include <errno.h> 
#include <stdexcept> 

const std::string LIB_PATH = "/data/data/com.bixense.jngl_test/lib/"; 

void* load_lib(const std::string& l) { 
    void* handle = dlopen(l.c_str(), RTLD_NOW | RTLD_GLOBAL); 
    if (!handle) { 
     throw std::runtime_error(std::string("dlopen(") + l + "): " + strerror(errno)); 
    } 
    return handle; 
} 

void ANativeActivity_onCreate(ANativeActivity* app, void* ud, size_t udsize) { 
    try { 
     load_lib(LIB_PATH + "libogg.so"); 
     load_lib(LIB_PATH + "libvorbis.so"); 
     auto main = reinterpret_cast<void (*)(ANativeActivity*, void*, size_t)>(
      dlsym(load_lib(LIB_PATH + "libjngl-test.so"), "ANativeActivity_onCreate") 
     ); 
     if (!main) { 
      throw std::runtime_error("undefined symbol ANativeActivity_onCreate"); 
     } 
     main(app, ud, udsize); 
    } catch(std::exception& e) { 
     __android_log_print(ANDROID_LOG_ERROR, "bootstrap", e.what()); 
     ANativeActivity_finish(app); 
    } 
} 

Я получаю следующее сообщение об ошибке:

dlopen(/data/data/com.bixense.jngl_test/lib/libjngl-test.so): Invalid argument 

Это не говорит мне, что происходит не так. Есть ли способ получить больше отладочного вывода? Что может означать «Недопустимый аргумент»?

ответ

-1

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

getResources().openRawResource(resourceName) 

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

+0

Почему это поможет? – jhasse

+0

, потому что вы не можете напрямую получить данные/данные/данные – blganesh101

+0

Я могу, получил код от http://stackoverflow.com/questions/12524664/cant-load-native-shared-library-with-dependencies-in-a- native-activity-app? rq = 1, и он отлично работает для libogg.so и libvorbis.so. – jhasse

0

Я установил его:

dlerror() 

дает гораздо лучшее сообщение об ошибке.

Вот загрузочный код, если кто-то заинтересован:

#include <android/native_activity.h> 
#include <android/log.h> 
#include <dlfcn.h> 
#include <errno.h> 
#include <stdexcept> 

void* load_lib(const std::string& l) { 
    auto handle = dlopen(std::string("/data/data/com.bixense.jngl_test/lib/" + l).c_str(), 
         RTLD_NOW | RTLD_GLOBAL); 
    if (!handle) { 
     throw std::runtime_error(std::string("dlopen(") + l + "): " + dlerror()); 
    } 
    return handle; 
} 

void ANativeActivity_onCreate(ANativeActivity* app, void* ud, size_t udsize) { 
    try { 
     load_lib("libogg.so"); 
     load_lib("libvorbis.so"); 
     auto main = reinterpret_cast<void (*)(ANativeActivity*, void*, size_t)>(
      dlsym(load_lib("libjngl-test.so"), "ANativeActivity_onCreate") 
     ); 
     if (!main) { 
      throw std::runtime_error("undefined symbol ANativeActivity_onCreate"); 
     } 
     main(app, ud, udsize); 
    } catch(std::exception& e) { 
     __android_log_print(ANDROID_LOG_ERROR, "bootstrap", e.what()); 
     ANativeActivity_finish(app); 
    } 
} 
Смежные вопросы