2015-05-25 151 views
7

我想在AWS上的VM上運行一些Android代碼。我已經從源代碼編譯的Android,當我試圖明確加載庫在Dalvik虛擬機(使用System.load)我看到下面的日誌:自編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不可執行(文件命令)。我發現某處用sim目標編譯Android會給我我需要的東西,但是我找不到sim目標存在的分支。

你有什麼想法如何解決加載共享庫的問題?或者也許知道哪個Android分支在午餐命令中有sim目標?

編輯:

一件事是,我發現,如果我使用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那麼你會得到那個錯誤信息。

所以我想知道如果上一行(請參閱下一代碼snipper)只是表明你的android_update_LD_LIBRARY_PATH是不正確的初始化。

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

這有幫助嗎?

找到的代碼在:original source