Android – 如何加载共享库?

2023-12-21

我创建了最简单的 EXECUTABLE 和 SHARED_LIBRARY。 如果不更改 LD_LIBRARY_PATH,则不会加载 SHARED_LIBRARY:

# ./hello
./hello
link_image[1995]: failed to link ./hello
CANNOT LINK EXECUTABLE

# LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ./hello
Hello, world!

所有代码如下:

first.h

#ifndef FIRST_H
#define FIRST_H

extern int first(int x, int y);

#endif /* FIRST_H */

first.c

#include "first.h"

int first( int x, int y ) {
    return x + y;
}

hello.c

#include <stdio.h>
#include "first.h"

int main( int argc, char **argv ) {
    printf( "Hello, world!\n" );
    first( 1000, 24 );
    return 0;
}

Android.mk

include $(CLEAR_VARS)
LOCAL_MODULE    := first
LOCAL_SRC_FILES := first.c
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := hello
LOCAL_SRC_FILES := hello.c
LOCAL_SHARED_LIBRARIES := first
LOCAL_LDFLAGS := -Wl,-rpath,. -Wl,-rpath,/data/data/testlib/lib
include $(BUILD_EXECUTABLE)

readelf——大家好

...
Dynamic section at offset 0xef4 contains 25 entries:
Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  INTERP         0x000154 0x00008154 0x00008154 0x00013 0x00013 R   0x1
      [Requesting program interpreter: /system/bin/linker]
...
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libfirst.so]
 0x00000001 (NEEDED)                     Shared library: [libstdc++.so]
 0x00000001 (NEEDED)                     Shared library: [libm.so]
 0x00000001 (NEEDED)                     Shared library: [libc.so]
 0x00000001 (NEEDED)                     Shared library: [libdl.so]
 0x0000000f (RPATH)                      Library rpath: [.:/data/data/testlib/lib]

RPATH 在这里,但链接器由于某种原因不使用它。

显然,动态链接器在 Android 上运行得很好(使用 LD_LIBRARY_PATH,它也与 RPATH 没有什么不同)

我做错了什么?

我错过了一些明显的东西吗?

在我的示例中,RPATH 有两个目录 (.:/data/data/testlib/lib),一个 (.) 就足够了。

此示例中没有 Java。项目没有使用它,也不需要它。

基本上我正在寻找一个从“我的目录”加载共享库的标准方法无需更改 LD_LIBRARY_PATH (有时这是不可能的)或使用包装器 dlopen 所有必需的库。


Bionic 链接器加载程序(AOSP 源代码中的 android/bionic/linker/linker.c,如果您想检查)似乎完全忽略了 ELF 中的 RPATH。它只考虑 LD_LIBRARY_PATH 和“/vendor/lib”和“/system/lib”的硬编码数组。

这是基于对我检查过的冰淇淋三明治树上的代码的粗略扫描。

这可以解释您所看到的行为。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android – 如何加载共享库? 的相关文章

  • 在 Android 上通话结束时启动活动

    我想在通话结束时启动一项活动 找不到任何对此的参考 我该怎么做 我还没有尝试过这个 但我假设你可以运行一些服务 始终在后台运行 它利用电话状态监听器 http developer android com reference android
  • android edittext中的字符映射

    我想让我的编辑文本就像我写字符 g 时一样 它是相关的映射自定义字符应该写成印地语中的 我认为应该有字符映射 但没有知识任何人都可以帮助我 怎么做 其他应用程序https play google com store apps details
  • 如何自定义菜单项的背景颜色?

    我正在尝试定制Toolbar的弹出菜单 现在我无法设置菜单项的背景颜色 我的 styles xml 如下所示
  • 如何在android中显示保存在sdcard文件夹中的图像[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 当我正在显
  • 按下按钮时应用不同的样式

    有没有办法在按下按钮时将样式应用于按钮 如果我有一种风格样式 xml
  • Android Q:file.mkdirs() 返回 false

    我们有一个应用程序 使用外部存储来存储一些临时文件 图像 二进制数据 该代码已经运行了几年 直到最近才发生重大变化 在 Android Q 上它不起作用 File f new File Environment getExternalStor
  • Recyclerview 动态部分不使用任何第三个库

    我想将标头添加到 recyclerview 我正在尝试使用来实现它 Override public int getItemViewType int position depends on your problem if position 0
  • 将现有 VARCHAR 列与 Room 结合使用

    我正在尝试将现有的数据库与 Android Room 一起使用 但是 我的一个表有一个 VARCHAR 列 Room 似乎只支持 TEXT 不支持 VARCHAR 而且 sqlite 不允许修改列类型 那么 有没有办法使用Room中现有的带
  • Android应用程序组件销毁和重新创建的详细信息

    有人可以向我提供一些具体的 值得信赖的 最好是简洁的 信息 内容如下 系统销毁和 如果适用 重新创建组件的顺序 片段 活动 活动的线程 异步任务 计时器 静态数据 类何时卸载 其他类中的线程 异步任务 定时器 主机 TabActivity
  • 如何重定向到 instagram://user?username={username}

    我的 html 页面上有这个链接 可以在特定用户上打开 Instagram 应用程序 a href Link to Instagram Profile a 我一直在寻找自动运行 url instagram user username USE
  • 以编程方式将文本颜色设置为主要 Android 文本视图

    如何设置我的文本颜色TextView to android textColorPrimary以编程方式 我已经尝试了下面的代码 但它将 textColorPrimary 和 textColorPrimary Inverse 的文本颜色始终设
  • 在 Cordova 应用程序中获取额外功能

    我们有两个 Android 应用程序 一个使用本机 Java 实现 另一个使用 Ionic 编写 Ionic 应用程序启动我的应用程序 这是使用灯插件 https github com lampaa com lampa startapp 我
  • Android 手机作为 GSM 调制解调器在 PC 上发送/接收短信?

    是否可以将 Android 移动设备用作 PC 上的 GSM 调制解调器 我正在 net下开发应用程序来发送 接收短信等 现在我想通过 USB 将我的 Android 设备连接到我的 PC 并将其用作 GSM 调制解调器来与其通信 这里是参
  • 使用片段时应用程序崩溃

    我正在处理碎片和 我的代码中有一个我找不到的问题 logcat 指向我的一个片段中的这段代码 Override public View onCreateView LayoutInflater inflater ViewGroup conta
  • 对于一个单元格,RecyclerView onBindViewHolder 调用次数过多

    我正在将 RecyclerView 与 GridLayoutManager 一起使用 对于网格中的每个项目 我需要调用 REST api 来检索数据 然后 从远程异步获取数据后 我使用 UIL 加载 显示图像 一切似乎都很好 但我发现 on
  • Android 中如何通过彩信发送图片?

    我正在开发多媒体应用程序 我正在通过相机捕获一张图像 并希望将该图像和文本发送到其他号码 但我不知道如何通过彩信发送图像 MMS 只是一个 http post 请求 您应该使用执行请求额外的网络功能 final ConnectivityMa
  • 您使用什么物理 Android 设备进行测试?

    有什么好的推荐用于测试目的的物理 Android 设备吗 我正在苹果阵营寻找像 iPod touch 这样的设备 可以帮助 iOS 开发人员测试他们的东西 我知道有 Nexus One 但那东西相当昂贵 而且我并不真正关心手机的东西 而是可
  • 上网本上可以进行Android开发吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想使用我的上网本进行 Android 开发 但是当我尝试使用 Eclipse 运行 SDK 时 没有加载任何内容 上网本对于 Android 开发来
  • Android:如何从网络异步获取搜索建议?

    我创建了一个可搜索的活动 现在 我想添加从网络服务获取的搜索建议 我想异步获取这些建议 根据添加自定义建议 http developer android com guide topics search adding custom sugge
  • Android 屏幕方向错误

    我使用的是 Android HTC HERO 2 1 版本 我写的活动

随机推荐

  • 使用linux内核模块发送UDP数据包而不使用套接字

    我正在编写一个创建 IP 数据包的内核模块 现在我想发送这个数据包 但还没有为其传输创建任何套接字 有没有办法在内核例程的帮助下直接发送它 因为我已经跟踪了用于数据包传输的 Linux 内核代码 所以定义了一个函数净 核心 dev c命名为
  • 多列的 formatStyle DT R

    我有一个包含一个 ID 列和多个数字列的 data frame 数字列的数量可能不同 在这些数字列中 我想将列上方的所有值均表示为绿色 将列下方的所有值均表示为红色 下面的代码给出了我想要的结果 但它不是具有或多或少数字列的数据框的通用代码
  • Slick Slider 无法在隐藏的 div 上正确加载

    标题是不言自明的 我正在单个 HTML 文件中创建一个网站 其中不同的页面只是div是从display none to display block 根据onclick功能 在其中一个页面中 我想使用光滑的滑块 不幸的是 第一次显示 div
  • 运行 React Native 应用程序时,在 Android Studio Bumblebee 中按 ctrl+m 时,调试器选项未打开

    运行 React Native 应用程序时 在 Android Studio Bumblebee 中按 ctrl m 时 调试器选项未打开 您必须首先启用模拟器在不同的窗口中运行 这将允许您使用键盘快捷键 要在单独的窗口中运行模拟器 请转至
  • 要求用户连接到互联网或退出应用程序(android)

    我正在开发一个图像库应用程序 其中应用程序从互联网检索图像 所以我想提示一个对话框 要求用户连接到互联网或退出应用程序 向用户显示 WiFi 和运营商网络选项 这会检查 wifi 和移动数据 在启动或您的主要活动上运行此代码来检查网络连接
  • 使用 mbedtls 的 AES-CMAC:未定义的参考错误

    我尝试使用 mbedTLS 实现 AES CMAC 我收到一些错误 未定义的引用mbedtls cipher cmac starts 未定义的引用mbedtls cipher cmac update 未定义的引用mbedtls cipher
  • 在 VB.NET 中连接数组[重复]

    这个问题在这里已经有答案了 在 Visual Basic 中连接一个或多个数组 或 ArrayList 的最简单方法是什么 我正在使用 NET 3 5 如果这很重要的话 这是用 C 编写的 但你肯定能弄清楚 int a new int 1
  • 如何通过从文件读取坐标自动画线?

    我正在尝试在一端画一条带有箭头的线 另外 我需要对同一图中的多个箭头自动执行此操作 d3 csv data coordinates csv then function data d x1 d x1 d y1 d y1 d x2 d x2 d
  • iPhone MonoTouch - 获取捆绑包版本

    在 MonoTouch 中 我们如何获取当前运行的包的版本 我最接近的猜测是在某个地方 NSBundle MainBundle ObjectForInfoDictionary 使用以下代码获取捆绑包的当前版本 NSBundle MainBu
  • Google Data Studio Connector 检索数据的不同参数

    我正在尝试连接到需要不同参数来检索数据的数据存储 我尝试过数据连接器的不同多个实例 但数据工作室似乎很难存储不同的配置值 数据连接器控件当前不可用于社区连接器 请问最好的方法是什么 社区连接器当前不支持参数化 我们计划将来添加此功能 目前
  • 无法连接到 SQL Server 来调试 SQLCLR 存储过程

    我想在 SQL Server 中调试 SQLCLR 存储过程 我一直在尝试在 VS2015 Community 和最近安装的 VS2017 Community 版本中调试 SP 但没有成功 我非常确定问题出在连接到 SQL Server 上
  • 如何使用 RVM 并创建全局可用的 gem?

    我正在运行 Mac OSX 10 6 4 并安装了 RVM 到目前为止 它非常棒 我真的很喜欢它让我在同一台机器上管理多个版本的 Rails 和 ruby 的方式 而不会让人头疼 但是 我不想为每个设置安装某些宝石 例如乘客 有没有办法在宝
  • 当达到字符限制时,AngularJS 阻止在文本区域上输入

    当达到最大字符数时 如何阻止用户在文本区域中输入更多字符 我现在使用 ng keypress 但我不知道如何在达到限制时阻止输入 用户不应能够在该文本区域中输入或粘贴总共超过 1000 个字符 问题是如何停止输入 而不是如何计算输入长度 这
  • ArticlesController#show 中的 ActiveRecord::RecordNotFound 无法找到没有 ID 的文章

    我正在尝试向数据库提交一些数据 但当我尝试检索这些数据时 显示无法找到没有 ID ils 4 0 1 的文章 我正在使用 ruby 2 0 0 和 ra def show article Article find params id end
  • 阻止 iPhone 缩放表格? [复制]

    这个问题在这里已经有答案了 代码
  • Scala 转换为泛型类型

    我对泛型类型感到困惑 我预计2 asInstanceOf A 被强制转换为类型A 同时 它被投射到Int 除此之外 输入是java lang Long而输出是一个列表Int 根据定义输入和输出应该是相同的类型 这是为什么 def whate
  • 如何在C#中使用Webclient填写表单并提交

    我是在 C 中使用 WebClient HttpResponse 和 HttpRequest 库的新手 所以如果我的问题读起来令人困惑 请耐心等待 我需要构建一个基于 C 的 WinForm 它可以打开一个 URL 该 URL 受到基本授权
  • 0/1 重量不合理的背包

    考虑0 1背包问题 http en wikipedia org wiki Knapsack problem 标准动态规划算法仅适用于背包的容量和重量均为整数 有理数时 当容量 重量不合理时怎么办 问题是我们不能像处理整数权重那样记忆 因为我
  • plsql 远程调试断点不起作用

    我在调试 pl sql 代码时遇到了奇怪的情况 我将 sql Developer 设置为侦听调试连接 在java代码中 我使用以下代码附加调试器 CallableStatement cstmt null try cstmt getConne
  • Android – 如何加载共享库?

    我创建了最简单的 EXECUTABLE 和 SHARED LIBRARY 如果不更改 LD LIBRARY PATH 则不会加载 SHARED LIBRARY hello hello link image 1995 failed to li