android - 自编译dalvik不加载共享库

标签 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 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 分支在 lunch 命令中有 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!";
    }
  }

看起来如果 sym == null 那么您会收到该错误消息。

所以我想知道上一行(请参阅下一个代码 fragment )是否仅表示您的 android_update_LD_LIBRARY_PATH 初始化不正确。

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

这有帮助吗?

找到代码:original source

关于android - 自编译dalvik不加载共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30434921/

相关文章:

java - DalvikVM 垃圾收集器会停止整个虚拟机吗?

java - 如果类实现较新的接口(interface),Android 推荐的安全支持较新 api 的方法会出错。为什么?

android - libvorbis-libogg-android中的本地引用表溢出(max = 512)

android - Intent 服务接收短信并关闭

c++ - 在 OS X 上链接期间包装符号

c++ - 在 Windows 上分发( native C++)库

java - 过度使用 Application 类来存储持久数据

android - 如何编写代码使用 Android 查询来搜索通话记录的数据库?

websphere - 将共享库附加到 WebSphere 应用程序的模块

java - Android:javac 与 Dalvik