Я пытаюсь запустить некоторый код Android на VM в AWS. Я составил Android от источника, и когда я пытаюсь загрузить библиотеку явно (с помощью System.load) в Dalvik VM Я вижу следующий журнал:Скомпилированный 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 от цели не является исполняемым (команда файла). Я где-то нашел, что компиляция Android с целью sim даст мне то, что мне нужно, но я не мог найти ветку, где присутствует цель sim.
У вас есть идеи, как устранить проблему при загрузке разделяемых библиотек? Или, может быть, знаете, какая ветка Android имеет цель sim в команде обеда?
Edit:
Еще одна вещь, которую я обнаружил, что если я бегу мое приложение с помощью 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
Любая идея, как это исправить? (Нужно ли это исправить?)