我正在尝试在AWS上的VM上运行一些
Android代码.我从源代码编译Android,当我尝试在dalvik vm中显式加载库(使用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 $@
Dalvikvm可以从/ out / host / 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
知道怎么解决吗? (我需要修理它吗?)
解决方法
我找到了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");
这有帮助吗?