2015-05-25 4 views
7

Я пытаюсь запустить некоторый код Android на VM в AWS. Я составил Android от источника, и когда я пытаюсь загрузить библиотеку явно (с помощью System.load) в Dalvik VM Я вижу следующий журнал:Скомпилированный dalvik не загружает разделяемые библиотеки

android_update_LD_LIBRARY_PATH not found; .so dependencies will not work! 

класс, который создает эту ошибку:

public class Server { 
    private static final int port = 8080; 

    public static void main(String[] args) throws Exception { 
     System.load("libandroid_runtime.so"); 
     WebServer webServer = new WebServer(port); 

     XmlRpcServer xmlRpcServer = webServer.getXmlRpcServer(); 

     PropertyHandlerMapping phm = new PropertyHandlerMapping(); 
     phm.addHandler("ImgCat", ImgCat.class); 
     xmlRpcServer.setHandlerMapping(phm); 

     XmlRpcServerConfigImpl serverConfig = 
      (XmlRpcServerConfigImpl) xmlRpcServer.getConfig(); 
     serverConfig.setEnabledForExtensions(true); 
     serverConfig.setContentLengthOptional(false); 

     webServer.start(); 
    } 
    } 

Сценарий я использую для запуска программ в dalvikvm:

#!/bin/sh 
base=/opt/android 
root=$base/out/host/linux-x86 
export ANDROID_ROOT=$root 
bootpath=$root/framework 
export BOOTCLASSPATH=$bootpath/core.jar:$bootpath/ext.jar:$bootpath /framework.jar:$bootpath/android.policy.jar:$bootpath/services.jar 
export LD_LIBRARY_PATH=$root/lib:$LD_LIBRARY_PATH 
export ANDROID_DATA=/tmp/dalvik_$USER 
mkdir -p $ANDROID_DATA/dalvik-cache 
echo $LD_LIBRARY_PATH 
exec dalvikvm [email protected] 

Dalvikvm исполняемый от/из/хоста/Linux-x86, а не цель. Я думаю, что это может быть проблема, но dalvikvm от цели не является исполняемым (команда файла). Я где-то нашел, что компиляция Android с целью sim даст мне то, что мне нужно, но я не мог найти ветку, где присутствует цель sim.

У вас есть идеи, как устранить проблему при загрузке разделяемых библиотек? Или, может быть, знаете, какая ветка Android имеет цель sim в команде обеда?

Edit:

Еще одна вещь, которую я обнаружил, что если я бегу мое приложение с помощью WithFramework он загружает некоторые библиотеки, а затем возвращает ошибку сегментации.

Edit2:

Я заметил, что там может быть проблема с libdl и LIBC. Libc зависит от libdl, чем отличается от моего хоста linux. Я проверил с readelf командой:

readelf -d /home/ubuntu/android-x86/out/target/product/generic_x86/system/lib/libc.so 

Dynamic section at offset 0x72c54 contains 21 entries: 
    Tag  Type       Name/Value 
0x00000001 (NEEDED)      Shared library: [libdl.so] 
0x0000000e (SONAME)      Library soname: [libc.so] 
0x00000019 (INIT_ARRAY)     0x727dc 

Libdl не зависит ни от чего:

readelf -d /home/ubuntu/android-x86/out/target/product/generic_x86/system/lib/libdl.so 

Dynamic section at offset 0x658 contains 19 entries: 
    Tag  Type       Name/Value 
0x0000000e (SONAME)      Library soname: [libdl.so] 
0x00000019 (INIT_ARRAY)     0x1640 

Но есть некоторые символы неопределенные:

nm -D /home/ubuntu/android-x86/out/target/product/generic_x86/system/lib/libdl.so 
0000164c T __FINI_ARRAY__ 
00001640 T __INIT_ARRAY__ 
0000173c A __bss_start 
     U __cxa_atexit 
     U __cxa_finalize 
     w __deregister_frame_info_bases 
     w __register_frame_info_bases 
     U __stack_chk_fail 
0000173c A _edata 
00001758 A _end 
00000520 T dl_iterate_phdr 
00000500 T dladdr 
00000510 T dlclose 
000004e0 T dlerror 
000004d0 T dlopen 
000004f0 T dlsym 

Любая идея, как это исправить? (Нужно ли это исправить?)

ответ

0

Я нашел местоположение в dalvik vm, откуда эта ошибка выбрасывается. Это выглядит так:

 if (javaLdLibraryPath != NULL) { 
    ScopedUtfChars ldLibraryPath(env, javaLdLibraryPath); 
    if (ldLibraryPath.c_str() == NULL) { 
     return NULL; 
    } 
    void* sym = dlsym(RTLD_DEFAULT, "android_update_LD_LIBRARY_PATH"); 
    if (sym != NULL) { 
     typedef void (*Fn)(const char*); 
     Fn android_update_LD_LIBRARY_PATH = reinterpret_cast<Fn>(sym); 
     (*android_update_LD_LIBRARY_PATH)(ldLibraryPath.c_str()); 
    } else { 
     LOG(ERROR) << "android_update_LD_LIBRARY_PATH not found; .so dependencies will not work!"; 
    } 
    } 

Похоже, если sym == null, то вы получите это сообщение об ошибке.

Так что мне интересно, если предыдущая строка (см. Следующий снимок кода) указывает просто, что ваш android_update_LD_LIBRARY_PATH инициализирован некорректно.

void* sym = dlsym(RTLD_DEFAULT, "android_update_LD_LIBRARY_PATH"); 

Помогло ли это?

нашёл этот код: original source

Смежные вопросы