如何在 Android 上使用带有 c 和 java api 的库项目

2024-01-30

我在谷歌 android-ndk 组中问过这个问题,但没有得到任何答案。

我正在尝试通过单击在独立项目中构建通用模块 “是图书馆”是日食。 该项目同时提供c api 和java api。虽然其中一些 api 是相关的。 (这意味着将它们分开不是一个好主意 分为2个项目) 我们将其命名为 common 和 libcommon.so。

当我在另一个项目中使用这个库时(假设是 testcommon), 我将公共项目添加为 eclipse 中的项目库 资源管理器-->属性-->Android-->库-->添加。 但这只能让我可以在库中使用java api。

另外,我将 libcommon.so 添加为 android.mk 中的 PREBUILT_SHARED_LIBRARY testcommon 项目,以便我可以访问 c api。 ( 如下 )

include $(CLEAR_VARS) 
LOCAL_MODULE := common-prebuilt 
LOCAL_SRC_FILES := ../../common/libs/$(TARGET_ARCH_ABI)/libcommon.so 
include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS)
LOCAL_MODULE    := testCommon 
LOCAL_SRC_FILES := testCommon.c 
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../common/jni/include/ 
LOCAL_SHARED_LIBRARIES := common-prebuilt 
include $(BUILD_SHARED_LIBRARY) 

这样,ndk-build 就成功了,但是当我运行它时,出现以下错误:

[2012-02-29 15:28:20 - testCommon] Error generating final archive: 
Found duplicate file for APK: lib/armeabi/libcommon.so 
Origin 1: E:\Code\EclipseWorkspace\testCommon\libs\armeabi\libcommon.so 
Origin 2: E:\Code\EclipseWorkspace\Common\libs\armeabi\libcommon.so 

我认为因为对库和预构建的引用都是共享的 库将 libcommon.so 添加到 testcommon 项目。 事实上,我已经测试过仅引用库或添加预构建 共享库,他们都将 libcommon.so 复制到 testcommon。

问题是,如果我需要一个同时具有 c 和 java api 的库,我该怎么办。(不仅仅是代码)

Thanks


我读完之后共享库可以调用另一个共享库吗? https://stackoverflow.com/questions/6041934/can-shared-library-call-another-shared-library,我找到了解决这个问题的方法,但仍然不太确定。

在 Android.mk 中使用以下行而不是 PREBUILT_SHARED_LIBRARY 也可以使本机部分正常工作,并且不会以这种方式复制库。这样重复的副本就可以被修复。

LOCAL_LDFLAGS := -L$(LOCAL_PATH)/../../Common/libs/$(TARGET_ARCH_ABI)/ -lcommon

这在我之前的测试中不起作用的原因是,即使这样,两个库都应该在java中加载,而不仅仅是libtestCommon。

System.loadLibrary("common"); // I lost this in my before test
System.loadLibrary("testCommon");

我想现在对我来说已经很清楚了。

LOCAL_SHARED_LIBRARIES 和 -L 加 -l 都应该在 NDK 中正常工作。

问题是当我打电话时

System.loadLibrary("testCommon")

它将尝试在 /data/data/$(app path)/lib (System.java::loadLibrary --> Runtime.java::loadLibrary --> DexPathList.java::findLibrary ) 中查找 so 文件,但是当 libtestCommon 尝试时要查找其依赖项 libCommon.so,它只会在 /vendor/lib 和 /system/lib 中找到它,因为

LD_LIBRARY_PATH=/vendor/lib:/system/lib.

如果我首先调用 System.loadLibrary("common"),dlopen 会将其加载到缓存中 (Linker.c::alloc_info)。我猜这使得 libtestCommon.so 加载 libCommon.so 成功。所以一切正常。

我还注意到 ndk-r7 中 SYSTEM-ISSUES.html 末尾的这些话:

  • 错误阻止一个应用程序共享库依赖于另一个应用程序 一。例如,如果您为您的项目同时构建 libfoo.so 和 libbar.so 应用程序,并将 libfoo.so 列为 libbar.so 的依赖项 bar/Android.mk(使用 LOCAL_SHARED_LIBRARIES := foo),然后加载 即使您已经加载了 libfoo.so,libbar.so 也总是会失败 在你的过程中。

有一点不同。如果我已经在我的进程中加载​​了 libfoo.so,则 libbar.so 将成功。

所以,最后的答案是:

  • 如果您需要 Android 库项目中的任何共享库,请使用 LOCAL_LDFLAGS := -Lxx -lxx 。
  • 您必须为每个所需的共享库调用 System.loadLibrary。这也是在一个库中使用另一个共享库的方法。
  • /libs/ 中的库路径放置在 /data/data//lib/ 中。

作为一个选项,您可以使用

LOCAL_ALLOW_UNDEFINED_SYMBOLS := true

在 Android.mk 之一中并排除重复的库。

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

如何在 Android 上使用带有 c 和 java api 的库项目 的相关文章

  • 对话框上的 EditText 不返回任何文本

    我太累了 找不到错误 我没有发现任何错误 但我没有从 editText 收到任何文本 请看下面的代码 活动密码 xml
  • 如何在 Android 中使用 Assets 中预加载的 SQLite 数据库

    我想用preloaded database在我的应用程序中意味着尝试在安装 apk 时获取数据库 以便可以使用已保存在其中的数据 我复制了 成分 db 文件位于资产文件夹中 并使用以下代码 但这会出现错误 从资源文件复制数据库时出现问题 我
  • Firebase 数据库快速入门处理计数的方式安全吗?

    我想为文章点赞创建一个增量字段 我指的是这个链接 https firebase google com docs database android save data save data as transactions https fireb
  • GridView 中多次调用 getView()

    我的 Activity 由包含 40 多个元素的 GridView 组成 开始活动后 用户最多可以看到 15 个项目 3 行 每行 5 个项目 我在 getView 正文中编写传递给获取 View 的 LogCat 编号 Log i get
  • 将正确的上下文传递给 greendao 的 OpenHelper 构造函数

    如果我理解正确的话 在使用数据库时 我必须执行以下操作 DaoMaster OpenHelper helper new DaoMaster OpenHelper this test db null Override public void
  • FileNotFoundException:/存储/模拟/0/Android

    我尝试这个文件写入器 读取器代码段进行测试 File file new File Environment getExternalStorageDirectory LM lm lisdat 01 txt FileOutputStream ou
  • 如何从一个代码库创建多个 Android 应用

    我有一个 Android 代码库 它使用带有设置的 API 来获取多个应用程序的不同数据 所有应用程序都使用相同的代码库 但进行一两个设计调整 那么如何重用主代码库而不必每次都复制整个 Android 项目呢 iPhone 在同一个项目中使
  • Android 应用被 Google Play 拒绝

    我最近向 Google Play 商店提交了一个 Android 应用程序 但收到一条消息说我的应用程序已被拒绝 我不确定问题是什么 也找不到确切的解决方案 拒绝原因 违反了禁止行为条款 内容政策 经过定期审核后 我们确定您的应用程序支持
  • 以编程方式更新 Android 中的联系人姓名和电话号码

    我创建一个应用程序来读取 更新 删除联系人详细信息 这是更新联系人姓名和电话号码的问题 有人可以帮助我吗 我该怎么做 我正在使用以下代码 但它不起作用 Override public View onCreateView LayoutInfl
  • Android Studio更新到1.5后Gradle错误

    今天我已将 Android Studio 更新到 v1 5 我的 libgdx 项目在这次更新之前运行良好 现在我收到此错误消息 Error Unable to load class org gradle mvn3 org sonatype
  • 如何强制从本机代码打开 Android 软键盘?

    我有一个游戏 当用户触摸屏幕时 它使用从 C 到 Java 的回调来强制打开软键盘 Java代码很简单是这样的 this inputMethodManager toggleSoftInput InputMethodManager SHOW
  • 如何将 android.net.Uri 转换为 java.net.URL? [复制]

    这个问题在这里已经有答案了 有没有办法从Uri to URL 我正在使用的库需要这个 它only接受一个URL但我需要在我的设备上使用图像 如果该方案的Uri is http or https new URL uri toString 应该
  • 如何持续更新MPAndroidChart中的Y轴值

    我希望 LineChart 中的轴能够实时调整其最大值和最小值 当新数据的 Y 值增加 正值和负值 时 像 ResetAxisMaxValue 和 ResetAxisMinValue 这样的函数可以很好地工作 但是 一旦信号再次变低 Y 值
  • 导航抽屉默认片段

    我是一名新手开发人员 我正在将导航抽屉与 android support v7 集成到我的应用程序中 我有一个问题 当我启动应用程序时 主要布局是这样的
  • Android Studio IDE 上的“文本/设计”选项卡缺少新的 Android 项目

    如何在创建新项目期间自动创建的 Activity main xml 文件的 src main res layout 文件夹中启用文本 设计选项卡 如果我右键单击并在所述文件夹上创建 xml 文件 则设计 文本选项卡存在 有什么建议吗 谢谢
  • Android - 如何更改 TimePicker 中的文本颜色?

    我正在使用 TimePicker 到 LinearLayout 中 背景颜色 黑色 但是 我看不到 TimePicker 中的数字 并且我需要在布局中将背景颜色设置为黑色 如何更改 TimePicker 中的 textColor 我已经尝试
  • 在 Honeycomb Android 3.0 中显示 Action Bar 菜单项的图标

    我正在使用 Honeycomb android 3 0 开发 Android 应用程序 我正在尝试在 Action Bar 中显示菜单 菜单有一个图标和标题 当我们单击菜单项时 它会以下拉列表的形式显示其项目 它是下拉列表中带有项目名称但不
  • FCM onMessageReceived 应用程序运行时返回空白消息和标题

    正如您在标题中所写 当应用程序关闭时 它运行良好 并且onMessageReceived获取消息正文和标题 但如果应用程序处于前台模式 运行模式 则可以发送通知 但没有消息和标题 请问该怎么办 代码 Override public void
  • 安卓的限制

    我需要构建一个应用程序 该应用程序拍摄相机图像并将其上传到网络 在网络上进行一些处理并返回真 假 我在这方面遇到了一些问题 希望得到澄清 1 我的应用程序有什么方法可以知道 Android 相机捕获的图像吗 我从这里明白了什么 Androi
  • Android ScrollView fillViewport 不工作

    我有一个简单的布局 名称位于顶部 按钮位于屏幕底部 或者超出该按钮 以防我添加更多项目 所以我使用带有 LinearLayout 的 ScrollView 如下所示

随机推荐

  • TypeScript 升级后 Promise 返回类型错误

    Using typescriptv2 3 4 以下代码运行良好 getStuff Promise
  • 如何在 Angular 7 中使用 JavaScript 代码?

    我正在尝试在移动屏幕上使用MaterializeCSS 的帮助下制作一个可折叠的导航栏 并且需要在其中使用JavaScript 代码 我应该在哪里编写这段 JavaScript 代码 这是我想使用的代码 document ready fun
  • 如何用C++限制循环中的FPS?

    我试图使用带有 chrono 和 thread 的 C 来限制执行相交检查的循环中的每秒帧数 这是我的代码 std chrono system clock time point now std chrono system clock now
  • 如何绕过指定“Host”标头来访问 Ingress 控制器指向的服务?

    我的入口控制器正在工作 我可以使用以下命令访问集群外部的服务http externalIP path使用来自 RestClient 的 HTTP GET 请求 但是 我必须指定 Host 标头与value host 我的 Ingress 资
  • 如何使用 CSS 设置代码列表样式?

    我想使用 CSS 在 HTML 文档中显示编程语言代码片段以及 HTML 代码 我希望它缩进并采用固定宽度的字体 我正在考虑类似的事情 blockquote my code here my code here also blockquote
  • 在 TFS 项目中查找标签

    我目前正在使用以下代码通过指定标签查找 tfs 项目内的分支 TfsTeamProjectCollection tfs new TfsTeamProjectCollection new Uri tfsuri var vcs tfs GetS
  • 如何更改 Subclipse 中的用户凭据?

    我正在使用 Subclipse Eclipse 中的 Subversion 集成 我现在想更改 subclipse 中的用户凭据 我怎么做 即使用另一个用户帐户登录 Subversion 删除或重命名 Eclipse 配置文件夹中的 Ecl
  • 如何在JavaFX中使用CSS制作动画?

    我想改变风格Node通过更改其样式类别 Button button new Button button getStyleClass add class1 button setOnMouseClicked new EventHandler
  • 如何获取我的IP地址? [复制]

    这个问题在这里已经有答案了 我有一个 serverSocket 我想知道 IP 地址 但是 listenSocket getInetAddress toString I get 0 0 0 0 如何获取 IP 地址或 如果启用了两个连接 其
  • NodeJS 读取/写入文件到网络驱动器

    我有一个使用 fs createWriteStream 将文件写入磁盘的脚本 我现在想要实现的目标是将这些文件写入共享网络驱动器 目录如下 hostname scratch reece 我在 Windows 上运行这个脚本 但是当我部署它时
  • Twitter API - 注销

    我在我的网络应用程序中使用 OAuth 用户可以使用 twitter 登录 我想添加 切换 twitter 帐户 按钮 该按钮实际上会清除会话 然后打开authorize url 由于清除我的网络应用程序中的会话不会注销 twitter 因
  • 如何仅将 jquery 应用于移动设备?

    我只需要为移动浏览器应用以下 jquery 这是为了重新排序引导列的位置 我该怎么做呢 需要用什么东西包裹起来吗 总是很难检测到它是移动设备的浏览器还是带有触摸屏的笔记本电脑 因此 不要检测它 如果您担心屏幕尺寸 那么我会建议您检测屏幕尺寸
  • 如果没有有效的选择,如何返回到第一个 if 语句

    如果没有正确满足条件 如何让 Python 移动到 if 语句的顶部 我有一个基本的 if else 语句 如下所示 print pick a number 1 or 2 a int raw input gt if a 1 print th
  • 从鼠标坐标到 3d 的点-三角形相交?

    我知道如何测试点和三角形之间的交点 但是我不明白 如何使用鼠标坐标将点的起始位置精确地移动到屏幕平面上 因此点角度应该根据鼠标光标在屏幕上的位置而变化 这也应该起作用完美的是 无论我在 OpenGL 应用程序中使用哪个透视角度 因此不同透视
  • 如何删除fiddler安装的根CA证书

    Fiddler 有助于添加唯一的根 CA 证书来拦截 HTTPS 流量 添加此证书后 如何删除它 两种方式之一 1 禁用 HTTPS 解密并单击标题为 删除拦截证书 的按钮 2 打开 CertMgr msc 打开个人和受信任存储 然后使用根
  • 以编程方式复制 WPF 控件

    我有一个选项卡控件 当用户想要添加到它时 我想复制几个已经存在的元素 而不仅仅是引用它们 现在 到目前为止我只是硬复制了我想要的变量 但我在自动调整大小代码中出现了裁剪器 也就是说 在调整窗口大小时 复制的元素明显落后于原始元素 此外 随着
  • HTML5 视频暂停时显示海报图像或暂停按钮?

    您好 我正在为 iPad 编写一个本地网站 并且有一个没有控件的视频 点击时会播放和暂停 视频暂停时能否显示海报图片 或者在中间显示一个暂停按钮 这是我用于播放和暂停的代码
  • Pandas - Groupby 数据帧存储为数据帧而不聚合

    我是 Pandas 的新手 我在这里阅读了很多文档 帖子和答案 但我一直无法辨别出实现我的目标的好策略 抱歉 如果它已经得到解答 我找不到它 这是我所拥有的 df key A B A B value 2 2 1 1 df pd DataFr
  • Django 有办法打开 HTTP 长轮询连接吗?

    保持连接打开 直到事件发生 看一下姜戈 彗星 推 万恶之中最小的 https stackoverflow com questions 4310706 django comet push least of all evils or Pytho
  • 如何在 Android 上使用带有 c 和 java api 的库项目

    我在谷歌 android ndk 组中问过这个问题 但没有得到任何答案 我正在尝试通过单击在独立项目中构建通用模块 是图书馆 是日食 该项目同时提供c api 和java api 虽然其中一些 api 是相关的 这意味着将它们分开不是一个好