Android 自编dalvik不';加载共享库
我正在尝试在AWS的VM上运行一些Android代码。我已经从源代码处编译了Android,当我尝试在dalvik vm中显式加载库(使用System.load)时,我会看到以下日志:Android 自编dalvik不';加载共享库,android,shared-libraries,dalvik,android-x86,Android,Shared Libraries,Dalvik,Android X86,我正在尝试在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 st
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是不可执行的(file命令)。我发现用sim-target编译Android可以满足我的需要,但我找不到sim-target所在的分支
您知道如何解决加载共享库的问题吗?或者知道哪个安卓分支在午餐命令中有sim目标
编辑:
我还发现,如果我使用WithFramework运行我的应用程序,它会加载一些库,然后出现故障
编辑2:
我注意到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!";
}
}
这有用吗
在以下位置找到代码:
void* sym = dlsym(RTLD_DEFAULT, "android_update_LD_LIBRARY_PATH");