Android NDK 模块依赖于另一个模块

2024-06-03

我有一个使用 Android NDK 编写的 Android 项目。在该项目中,我使用两个预构建的共享库(GpkgSDK 和 Spatialite)并构建另外两个共享库(WFSHelpers 和 com_example_gpkgviewer_jni_WKTConverter)。与应用程序的 Java 级别交互的唯一库是 com_example_gpkgviewer_jni_WKTConverter 库。

各库之间的依赖关系如下图所示:

  • WFSHelpers依赖于GpkgSDK和spatialite
  • com_example_gpkgviewer_jni_WKTConverter 依赖于 WFSHelpers

我遇到的问题是,当我尝试运行 ndk-build 时,在尝试构建 com_example_gpkgviewer_jni_WKTConverter 库时,我收到了很多未定义的引用。其他库均已成功构建。我通常解决这些未定义引用的方法是在我的 com_example_gpkgviewer_jni_WKTConverter 模块定义中包含以下内容:

LOCAL_SHARED_LIBRARY := WFSHelpers

我不确定是否还需要包含 WFSHelpers 所依赖的库,如下所示:

LOCAL_SHARED_LIBRARY := WFSHelpers GpkgSDK spatialite

我也以不同的顺序尝试过它们,但它似乎没有解决我的问题:

  • LOCAL_SHARED_LIBRARY := GpkgSDK Spatialite WFSHelpers

我的 Application.mk 包含在下面:

NDK_TOOLCHAIN_VERSION := 4.8
# APP_STL := stlport_shared  --> does not seem to contain C++11 features
APP_STL := gnustl_shared

# Enable c++11 extentions in source code
APP_CPPFLAGS += -std=c++11
APP_CPPFLAGS += -frtti 
APP_CPPFLAGS += -fexceptions

APP_MODULES := GpkgSDK spatialite WFSHelpers com_example_gpkgviewer_jni_WKTConverter

APP_ABI := armeabi armeabi-v7a

我的Android.mk如下所示:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := GpkgSDK
LOCAL_SRC_FILES := libMP.so
LOCAL_EXPORT_C_INCLUDES := \
$(LOCAL_PATH)/include \
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := spatialite
LOCAL_SRC_FILES := spatialamal/prebuilt/$(TARGET_ARCH_ABI)/libspatialite.so
LOCAL_EXPORT_C_INCLUDES :=     spatialamal/headers/spatialite \
                            spatialamal/headers
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := WFSHelpers
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
LOCAL_SRC_FILES := \
GPKGReader/Debug.h \
GPKGReader/DLLExport.h \
GPKGReader/DBQueryResult.cpp \
GPKGReader/GeoPackageDB.cpp \
GPKGReader/GPKGReader.cpp \
GPKGReader/order32.h \
GPKGReader/SpecDefinitions.h \
GPKGReader/WKBGenericGeometry.cpp \
GPKGReader/WKBLineString.cpp \
GPKGReader/WKBMultiLineString.cpp \
GPKGReader/WKBMultiPolygon.cpp \
GPKGReader/WKBPoint.cpp \
GPKGReader/WKBPolygon.cpp \
GPKGDataLayer/GPKGDataLayer.cpp
LOCAL_SHARED_LIBRARIES := GpkgSDK spatialite
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
LOCAL_MODULE    := com_example_gpkgviewer_jni_WKTConverter
LOCAL_SRC_FILES := com_example_gpkgviewer_jni_WKTConverter.cpp
LOCAL_SHARED_LIBRARY := WFSHelpers GpkgSDK spatialite
include $(BUILD_SHARED_LIBRARY)

我收到的未定义参考错误的示例如下所示:

[armeabi] SharedLibrary  : libcom_example_gpkgviewer_jni_WKTConverter.so
jni/com_example_gpkgviewer_jni_WKTConverter.cpp:59: error: undefined reference
o 'WKBGenericGeometry::readInt32(unsigned char, unsigned char*, unsigned int)'
collect2.exe: error: ld returned 1 exit status
make.exe: *** [obj/local/armeabi/libcom_example_gpkgviewer_jni_WKTConverter.so]
Error 1

com_example_gpkgviewer_jni_WKTConverter.cpp 中导致此错误的代码行如下所示:

*id_arg = WKBGenericGeometry::readInt32(byte_order, &(bytes[4]), length - 4);

关于如何解决依赖关系的任何建议。


经过多年的尝试,我终于能够让它发挥作用了。虽然,我不太确定有什么区别,所以欢迎任何能够阐明这一点的人这样做。我的问题是我依赖其他库。该文档说明如下:

LOCAL_SHARED_LIBRARIES
共享库模块列表 模块依赖于运行时。这在链接时是必要的,并且 在生成的文件中嵌入相应的信息。

LOCAL_LDLIBS
构建共享库或可执行文件时要使用的附加链接器标志的列表。这对于通过 带有“-l”前缀的特定系统库的名称。例如, 下面将告诉链接器生成一个链接到的模块 /system/lib/libz.so 在加载时:

LOCAL_LDLIBS := -lz

请参阅 STABLE-APIS,了解可与此 NDK 版本链接的公开系统库的列表。
注意:对于静态库,这会被忽略,并且 ndk-build 将在以下情况下打印警告: 您在这样的模块中定义它。

因此,在我的 Android.mk 文件中,我必须使用 LOCAL_LDLIBS 而不是 LOCAL_SHARED_LIBRARIES 来指示依赖关系。

我新建的Android.mk如下图:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := GpkgSDK
LOCAL_SRC_FILES := libMP.so
LOCAL_EXPORT_C_INCLUDES := \
$(LOCAL_PATH)/include \
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := spatialite
LOCAL_SRC_FILES := spatialamal/prebuilt/$(TARGET_ARCH_ABI)/libspatialite.so
LOCAL_EXPORT_C_INCLUDES :=     spatialamal/headers/spatialite \
                            spatialamal/headers
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := WFSHelpers
LOCAL_SRC_FILES := \
GPKGReader/Debug.h \
GPKGReader/DLLExport.h \
GPKGReader/DBQueryResult.cpp \
GPKGReader/GeoPackageDB.cpp \
GPKGReader/GPKGReader.cpp \
GPKGReader/order32.h \
GPKGReader/SpecDefinitions.h \
GPKGReader/WKBGenericGeometry.cpp \
GPKGReader/WKBLineString.cpp \
GPKGReader/WKBMultiLineString.cpp \
GPKGReader/WKBMultiPolygon.cpp \
GPKGReader/WKBPoint.cpp \
GPKGReader/WKBPolygon.cpp \
GPKGDataLayer/GPKGDataLayer.cpp
LOCAL_LDLIBS := libs/$(TARGET_ARCH_ABI)/libGpkgSDK.so
LOCAL_LDLIBS += libs/$(TARGET_ARCH_ABI)/libspatialite.so
LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := com_example_gpkgviewer_jni_WKTConverter
LOCAL_SRC_FILES := com_example_gpkgviewer_jni_WKTConverter.cpp
LOCAL_LDLIBS := libs/$(TARGET_ARCH_ABI)/libWFSHelpers.so
LOCAL_LDLIBS += libs/$(TARGET_ARCH_ABI)/libGpkgSDK.so
include $(BUILD_SHARED_LIBRARY)

我将暂时保留这个答案,因为我不完全确定 LOCAL_LDLIBS 和 LOCAL_SHARED_LIBRARIES 之间的区别是什么。如果有人可以向我提供解释,请这样做。如果没有,我会在给它一些时间后将此答案标记为已接受。谢谢 !

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

Android NDK 模块依赖于另一个模块 的相关文章

  • setContentView 上的另一个资源$NotFoundException

    Stack Overflow 上有很多 Resources NotFoundException 问题 我已经查看了它们并尝试了各种建议 但均无济于事 我有一个完美的工作布局来显示一些图形 下面有一些按钮 我修改了一些按钮并开始出现此错误 我
  • 对 AAssetManager_fromJava 的未定义引用

    我正在尝试使用 AAssetManager 从 Android apk 访问资源 然而 我不断得到 未定义对 AAssetManager fromJava 的引用 即使我已包含 asset manager h 和 asset manager
  • 如何在Eclipse调试器中查看崩溃原因

    按照这个 Android 教程 http developer android com resources tutorials hello world html http developer android com resources tut
  • 如何编写带有回调的简单react-native本机模块

    如何以最简单的方式完成这项工作 我无法将回调发送到react native 可能我错过了一些东西 ReactMethod public void testCallback Callback cb String sampleText Java
  • 如何设置 MediaCodec 创建的编码器缓冲区大小

    我正在尝试使用 Nexus 来测试 Mediacodec API 的编码 我可以看到编码器提供的inputBuffers是119040 通过记录inputBuffers capacity 但帧的大小 即输入 是 460800 我收到错误消息
  • 在android中添加音频到视频

    我想开发一个可以录制视频 mp4 的android应用程序 然后我的资源文件夹中有一些音频文件 mp3 我想将其添加到视频的末尾 所以最终的效果就像首先播放视频 在视频结束时会听到添加的音频 我该怎么做 合并具有不同音频编解码器的文件并不容
  • 如何在 Kotlin 中获取可绘制对象?

    I am working on a small project in Android Studio I have drawable added to res drawable folder 但是我无法从代码中获取它 我尝试过不同的方法 Co
  • 更改Android TabWidget底部栏颜色

    如何更改 TabWidget 底部栏的颜色 我已经成功更改了选项卡背景颜色 但底部栏仍然是灰色 橙色 并且我在 Android 文档和源代码中找不到与此相关的任何信息 谢谢 See 启用 禁用此行 tabHost getTabWidget
  • Jetpack Compose 预览未显示

    我似乎在撰写预览时遇到问题 当我使用 preview 注释撰写方法时 布局面板不会出现 我假设我缺少依赖项 但我已从此处复制并粘贴了代码https developer android com jetpack compose setup ht
  • OpenGL ES 2.0 只绘制一次对象

    首先我要说的是 很抱歉今天问了这么多问题 所以 我有一个圈子的课程 我有一个包含 3 个圆形实例的数组列表 每个实例都有不同的 x 坐标来绘制 不管出于什么原因 OpenGL ES 2 0 只绘制其中之一 尽管我调用所有这些来绘制 我检查了
  • 是否可以检测Android应用程序卸载?

    我的应用程序使用 Google 的 C2DM 推送通知 来通知用户朋友的新活动 一旦他们安装了应用程序 我就会向 C2DM 服务器注册设备并存储用户的电话号码 所以我知道用户正在使用我的应用程序 我可以向他 她发送推送通知 但是 如果用户卸
  • Android架构组件导航:工具栏后退按钮缺失,后退不起作用

    我正在尝试喷气背包导航 但当我移动到新片段时无法显示导航后退按钮 导航活动 kt class NavActivity AppCompatActivity override fun onCreate savedInstanceState Bu
  • Google App Engine 的示例 Android 应用程序,抛出异常

    我的 GAE 示例 Android 应用程序直到昨天都工作正常 除了在 Consts java 中添加了我的项目 ID 之外 我没有对客户端应用程序进行任何更改 现在每次我尝试插入 我的意思是发送消息 时都会抛出以下异常 06 06 09
  • Android avd 管理器根本不工作 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我最近想尝试创建一个 Android
  • Android 开发工具无法通过 adb 识别 Asus Nexus 7

    问题 正确安装和连接后 adb 无法识别 Asus Nexus 7 设置 华硕 Nexus 7 平板电脑 Windows 7 64 位操作系统 采取的步骤 安装64位Java JDK http www oracle com technetw
  • 使用 ADB 更改 Android 壁纸?

    我想知道是否可以使用我的笔记本电脑从 ADB 更改 Android 壁纸 我不知道是否存在任何命令 或者我是否需要将图片复制到文件夹或编辑文本文件 如果可以的话 我需要通过 ADB 解决这个问题 谢谢大家 您只需要启动正确的壁纸设置意图 由
  • Android 应用程序中最用户友好的布局选项

    所以我面临的问题不是主观判断什么对用户最好 我认为 而是有哪些选项可以用来说明定位 Think of some sort of team sports app where you can put little dots for player
  • 如何使用 Android 的身份验证标签进行 GCM 加密

    我想制作一个通过 GCM 模式与 Android 身份验证标签加密数据的函数 这是我的源代码 public static byte GCMEncrypt String hexKey String hexIV byte aad throws
  • 将 cookie 存储在共享首选项中

    我一直在绞尽脑汁地试图弄清楚这一点 我正在制作一个 HttpsURLConnection 并使用 java net cookiemanager 来管理我的 cookie 据我所知 无法使用 android webkit cookiemana
  • JSON 解析为 Java - Android 应用程序

    我需要在 Java Android 应用程序中解析 json 字符串的帮助 JSON 文件的文本 data columns location id name description latitude longitude error type

随机推荐

  • SVN 不会缓存凭据

    我正在使用命令行 svn 客户端 版本 1 6 12 来自 Ubuntu 存储库 但我似乎无法让它缓存我的用户凭据 我正在尝试访问 https svn 存储库 类似于https subversion FAKE com PROJECT htt
  • Mac OS Sandbox:从助手启动主应用程序

    我在沙箱中创建了一个应用程序 它使用助手在登录时启动 如所示here http blog timschroeder net 2012 07 03 the launch at login sandbox project 它工作正常 但以下消息
  • hg 语法的作用是什么:提交 A 是否可以从提交 B“到达”

    我的存储库的历史非常复杂 我经常发现自己想知道过去的某个提交是否 在 或 可从 某个修订 通常是我的头脑之一 到达 我该怎么做呢 您可以使用转速集语法 http selenic com hg help revsets 假设您想询问修订版 4
  • OS X 对 /usr/local/lib 的权限被拒绝

    我正在寻找有关权限问题的任何建议 直觉 线索 答案 自从我切换到新的 Macbook Pro 以来 这个问题一直困扰着我 这就是困境 某些程序在安装期间复制 usr local lib 下的库 并且在运行这些程序时出现崩溃 我认为这与此文件
  • 如何捕获 Ctrl + Alt + RShftKey

    For some time I m trying to catch Ctrl Alt Right Shift Key under common VBNET key handler Here are my tests If e Control
  • git 漂亮格式占位符之间的空格

    因为某些原因 这个原因 https stackoverflow com questions 53034425 git log pretty format windows strange behavior 我可能需要运行这样的 git 命令
  • 如何使用抽屉布局左侧移动主要内容

    刚刚检查了如何使用 DrawerLayout 制作菜单here http www androidhive info 2013 11 android sliding menu using navigation drawer 但左侧菜单正在移动
  • React 重新渲染数组,而 item key 没有改变

    列表的非常基本的代码示例 class List extends React Component render const listComponent this props numbers map number gt
  • UITouch移动速度检测

    我正在尝试检测触摸移动的速度 但并不总能得到我期望的结果 补充 速度峰值太多 任何人都可以发现我是否在做一些时髦的事情或建议更好的方法吗 void touchesBegan NSSet touches withEvent UIEvent e
  • MUI 组件上的渐变边框

    我没能找到相当于border image source css 我的目标是在按钮组件上渲染边框渐变 这是添加渐变边框的方法button成分 V5 const options shouldForwardProp prop gt prop gr
  • 方向改变后的javascript最大视口高度Android和iOS

    目标 查找设备的最大视口高度 包括设备的空间address bar这样我们就可以动态调整 min body 的大小并将内容向上推 问题 移动浏览器处理方向状态的方式不同 方向变化时更新 DOM 属性的方式也不同 使用 JavaScript
  • 使用 C# 9.0 记录构建类智能枚举/类判别联合/类和类型数据结构?

    玩弄record在 C 中输入 看起来它对于构建类似可区分联合的数据结构非常有用 我只是想知道我是否错过了一些我以后会后悔的陷阱 例如 abstract record CardType Case types public record Ma
  • RecyclerView 未按预期滚动

    我有一个项目 我使用水平回收器视图 并且我想将一个元素居中 我的实现有效 但并非在所有情况下都可以检查此 GIF 正如您可能注意到的 如果我从左边来 它会正确滚动 如果我从右边来 它会过度滚动很多 我不知道如何停止也不知道如何解决这个问题
  • 使用 R 中的晶格为 xyplot 中的每个面板添加不同的垂直线

    我有一个按年份排列的几个站点的植物物种频率图 我正在使用 grid 包中的 xyplot 绘制这些站点 我已经弄清楚如何获取每个物种位点组合的散点图 但是 我想添加一个 abline 代表进行化学处理的每年 每个地点在不同年份添加了化学处理
  • 将 babel polyfill 添加到 React Native 项目

    我在 Android 上遇到问题 得到这个错误 undefined 不是一个函数 评估 iterator2typeof Symbol function Symbol iterator iterator 我觉得和for of es6的使用有关
  • GWT 检测 GAE 版本更改并重新加载

    我的用户平均每次使用我的 GWT 应用程序 40 分钟 因此当我升级 GAE 后端的版本号时 他们在浏览器中运行的版本有很长一段时间与版本不匹配在服务器上支持它 大多数功能都被破坏 抛出不兼容的 RemoteServiceException
  • 本地化 watchkit 配套应用程序的显示名称

    我在 Apple Watch 配套应用程序上本地化应用程序显示名称时遇到一些问题 按照指导方针 我将 CFBundleName 本地化如下 CFBundleDisplayName 我的应用程序 CFBundleName 我的应用程序 我为我
  • 网络插件未准备好:cni 配置未初始化

    Kubelet未就绪 runtime network not ready NetworkReady false reason NetworkPluginNotReady message docker network plugin is no
  • 如何启用对 MySQL 服务器的外部访问? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 如何启用对 MySQL 服务器的外部访问 我可以在本地连接 但无法从网络上的另一个盒子进行连接 我刚刚尝试过 grant all privileges
  • Android NDK 模块依赖于另一个模块

    我有一个使用 Android NDK 编写的 Android 项目 在该项目中 我使用两个预构建的共享库 GpkgSDK 和 Spatialite 并构建另外两个共享库 WFSHelpers 和 com example gpkgviewer