2015-05-25 4 views
7

मैं एडब्ल्यूएस में वीएम पर कुछ एंड्रॉइड कोड चलाने की कोशिश कर रहा हूं। मैं स्रोत से एंड्रॉयड संकलित किया है और जब मैं स्पष्ट रूप से एक पुस्तकालय लोड करने के लिए कोशिश कर रहा हूँ Dalvik वी एम में (System.load उपयोग करते हुए) मैं लॉग निम्न देखें:स्व-संकलित दल्विक साझा पुस्तकालयों को लोड नहीं करता

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 निष्पादन योग्य/बाहर/होस्ट/लिनक्स 86 से, लक्षित नहीं है। मुझे लगता है कि यह एक समस्या हो सकती है, लेकिन लक्ष्य से dalvikvm निष्पादन योग्य नहीं है (फ़ाइल कमांड)। मुझे कहीं पता चला है कि सिम लक्ष्य के साथ एंड्रॉइड को संकलित करने से मुझे जो चाहिए वह मुझे देगा, लेकिन मुझे शाखा नहीं मिली जहां सिम लक्ष्य मौजूद है।

क्या आपको कोई विचार है कि साझा पुस्तकालयों को लोड करने के साथ समस्या को कैसे ठीक किया जाए? या शायद पता चलेगा कि किस एंड्रॉइड शाखा में लंच कमांड में सिम लक्ष्य है?

संपादित करें:

एक और बात मैंने पाया है कि यह कुछ पुस्तकालयों और फिर segfaults लोड करता है अगर मैं WithFramework उपयोग करते हुए मेरे एप्लिकेशन को चलाने के लिए है।

EDIT2:

मैंने देखा है libdl और libc के साथ एक समस्या हो सकती है। Libc libdl पर निर्भर करता है जो मेरे होस्ट लिनक्स से भिन्न है। मैं 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

मुझे दल्विक वीएम में स्थान मिला जहां यह त्रुटि फेंक दी गई है। यह ऐसा दिखाई देता है:

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

ऐसा लगता है कि अगर प्रतीक == बातिल तो आप उस त्रुटि संदेश मिलता है।

तो मुझे आश्चर्य है कि पिछली रेखा (अगला कोड स्निपर देखें) यह इंगित करता है कि आपके android_update_LD_LIBRARY_PATH को गलत तरीके से प्रारंभ किया गया है।

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

क्या इससे मदद मिलती है?

को कोड मिला: original source

संबंधित मुद्दे