2015-05-25 25 views
7

Ich versuche, etwas Android-Code auf VM in AWS auszuführen. Ich habe Android aus den Quellen kompiliert und wenn ich versuche, explizit eine Bibliothek zu laden (mit System.load) in Dalvik vm Ich sehe folgendes Protokoll:Selbst kompilierte dalvik lädt keine geteilten Bibliotheken

android_update_LD_LIBRARY_PATH not found; .so dependencies will not work! 

Klasse, die diesen Fehler erzeugt:

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(); 
    } 
    } 

Script verwende ich Programme in dalvikvm auszuführen:

#!/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 von/aus/Host/linux-x86 ausführbar ist, zielen nicht auf. Ich denke, es kann ein Problem sein, aber dalvikvm vom Ziel ist nicht ausführbar (Dateibefehl). Ich habe irgendwo gefunden, dass das Kompilieren von Android mit Sim-Ziel mir geben wird, was ich brauche, aber ich konnte Zweig nicht finden, wo sim Ziel vorhanden ist.

Haben Sie eine Idee, wie Sie das Problem beim Laden von gemeinsam genutzten Bibliotheken beheben können? Oder vielleicht wissen, welche Android-Zweig hat Ziel in Mittagessen Befehl?

Edit:

Eine weitere Sache, die ich gefunden, dass, wenn ich meine app laufen mit WithFramework es einige Bibliotheken lädt und dann segfaults.

Edit2:

Ich habe bemerkt, dass es möglicherweise ein Problem mit libdl und libc sein. Libc hängt von libdl ab, was anders ist als auf meinem Host-Linux. Ich habe mit readelf Befehl geprüft:

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 nicht auf alles abhängt:

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 

Aber es gibt einige Symbole undefined:

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 

Jede Idee, wie man es beheben? (Muss ich es reparieren?)

Antwort

0

Ich fand den Ort in Dalvik Vm, wo dieser Fehler geworfen wird. Es sieht wie folgt aus:

 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!"; 
    } 
    } 

Es sieht aus wie wenn sym == null dann erhalten Sie diese Fehlermeldung.

Also frage ich mich, ob die vorherige Zeile (siehe nächsten Code-Snipper) einfach anzeigt, dass Ihr android_update_LD_LIBRARY_PATH unkorrekt initialisiert wurde.

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

Hilft das?

gefunden der Code unter: original source