2015-05-25 21 views
7

Tôi đang cố gắng chạy một số mã Android trên máy ảo trong AWS. Tôi đã biên soạn Android từ nguồn và khi tôi đang cố gắng để tải một thư viện một cách rõ ràng (sử dụng System.load) trong Dalvik vm tôi thấy sau log:Tự biên dịch dalvik không tải thư viện được chia sẻ

android_update_LD_LIBRARY_PATH not found; .so dependencies will not work! 

lớp mà tạo ra lỗi này:

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 tôi sử dụng để chạy các chương trình trong 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 được thực thi từ ra/vào/host/linux-x86, không nhắm mục tiêu. Tôi nghĩ rằng nó có thể là một vấn đề, nhưng dalvikvm từ mục tiêu là không thực thi (lệnh tập tin). Tôi đã tìm thấy một nơi nào đó mà biên dịch Android với mục tiêu sim sẽ cung cấp cho tôi những gì tôi cần, nhưng tôi không thể tìm thấy chi nhánh nơi có mục tiêu sim.

Bạn có biết cách khắc phục sự cố với tải thư viện được chia sẻ không? Hoặc có thể biết chi nhánh Android nào có mục tiêu sim trong lệnh ăn trưa?

Edit:

hơn Một điều tôi nhận thấy là nếu tôi chạy ứng dụng của tôi sử dụng WithFramework nó tải một số thư viện và sau đó segfaults.

Chỉnh sửa2:

Tôi nhận thấy rằng có thể có vấn đề với libdl và libc. Libc phụ thuộc vào libdl những gì là khác nhau hơn trên máy chủ của tôi linux. Tôi đã kiểm tra với lệnh 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 không phụ thuộc vào bất cứ điều gì:

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 

Nhưng có một số biểu tượng không xác định:

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 

Bất kỳ ý tưởng làm thế nào để sửa chữa nó? (Tôi có cần phải sửa chữa nó không?)

Trả lời

0

Tôi đã tìm thấy vị trí trong valvik vm nơi lỗi này được đưa ra. Có vẻ như sau:

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

Có vẻ như nếu sym == null bạn nhận được thông báo lỗi đó.

Vì vậy, tôi tự hỏi nếu dòng trước đó (xem mã snipper tiếp theo) chỉ đơn giản là android_update_LD_LIBRARY_PATH của bạn được khởi tạo không chính xác.

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

Điều này có hữu ích không?

tìm mã tại: original source

Các vấn đề liên quan