使用 C++ 和 NativeActivity 类获取 Android APK 的名称

2023-12-10

我正在使用 NDK 和 NativeActivity 编写 Android 应用程序。我的应用程序依赖于一些作为资产提供的第三方代码。目前,我正在尝试提取这些资产,同时保持文件夹结构完整。

我尝试过使用 AssetManager,但为了保持文件夹结构完整,对于像我提到的这样的简单任务,似乎会涉及大量代码。此后,我将注意力转移到尝试将 APK 视为 ZIP 文件并以这种方式提取其内容。但这需要我找到 APK 的确切路径。

在普通的 Android 应用程序中,我们会使用 getPackageCodePath,但这是附加到 Context 类的一个抽象方法。我的问题是,在不使用正常 Activity 时如何获取 APK 的确切路径?

我还尝试通过 JNI 调用 getPackageCodePath,但由于无法找到该方法而导致应用程序崩溃。

编辑: 这可能吗?


我实际上能够打电话getPackageCodePath通过 JNI 并让它工作。下面的代码放在最上面android_main在 NDK r7 的本机活动示例中记录正确的路径并且不会崩溃:

void android_main(struct android_app* state) {
    struct engine engine;

    ANativeActivity* activity = state->activity;
    JNIEnv* env = activity->env;

    jclass clazz = (*env)->GetObjectClass(env, activity->clazz);
    jmethodID methodID = (*env)->GetMethodID(env, clazz, "getPackageCodePath", "()Ljava/lang/String;");
    jobject result = (*env)->CallObjectMethod(env, activity->clazz, methodID);

    const char* str;
    jboolean isCopy;
    str = (*env)->GetStringUTFChars(env, (jstring)result, &isCopy);
    LOGI("Looked up package code path: %s", str);

    ...
}

不过,我觉得这可能不是一个很好的解决方案。有两件事让我担心:

  1. 线程安全 - 有一个关于仅使用env成员ANativeActivity在主 Java 线程中,如果我理解正确的话,这段代码将在本机活动的线程中运行。
  2. ANativeActivity's clazz成员似乎命名错误,实际上是 Java 的实例NativeActivity而不是类对象。否则这段代码将无法工作。我真的很讨厌依赖像这样明显命名错误的东西。

除此之外,它确实有效,而且我实际上自己也打算使用它来尝试使用 libzip 将资产从 .apk 中提取出来并放入数据目录中。

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

使用 C++ 和 NativeActivity 类获取 Android APK 的名称 的相关文章

  • 如何在 Android / Java 中获取图像的分辨率

    如何在 Android 中找到任何图像的分辨率 获取存储在磁盘中的图像大小的有效方法 例如获取用户选择上传的图像文件的大小 是使用BitmapFactory Options并设置inJustDecodeBounds为真 这样做你就会获取图像
  • 与其他图标相比,AppCompat ShareActionProvider 图标太大

    我将 ActionBarSherlock 更改为 AppCompat v7 我已经完成了使其工作所需的所有更改 但是共享图标 使用 ShareActionProvider 发生了一些奇怪的情况 与其他图标相比 共享图标太大 我还使用支持库进
  • v7 RecyclerView NullPointerException AccessibilityDelegateCompat.getBridge()

    运行我的 recyclerview 列表片段时出现此错误 java lang NullPointerException Attempt to invoke virtual method java lang Object android su
  • 强制用户在 Android 中的 EditText 中输入内容

    我的活动中有几个编辑文本 我希望我的用户在提交表单之前正确输入 我该怎么做 我还有旋转器和 RadioGroup 按钮 你可以加验证在提交按钮上单击 private boolean validateFields int yourDesire
  • Firebase 数据库快速入门处理计数的方式安全吗?

    我想为文章点赞创建一个增量字段 我指的是这个链接 https firebase google com docs database android save data save data as transactions https fireb
  • 将正确的上下文传递给 greendao 的 OpenHelper 构造函数

    如果我理解正确的话 在使用数据库时 我必须执行以下操作 DaoMaster OpenHelper helper new DaoMaster OpenHelper this test db null Override public void
  • ProGuard 无法与 Windows 中使用的 Joda Time 一起编译

    实际上 这是一个答案 而不是一个问题 我确实在 Windows 上花了很多时间 使用 JodaTime 并使用 ProGuard 将其包含在我的 Android 项目中 混淆器配置 libraryjars C Users Reto Docu
  • 如何从一个代码库创建多个 Android 应用

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

    我不知道如何编写图像的支架 我已经设置了 2 个文本 但我不知道图像的支架应该是什么样子 你能帮我告诉我图像的文字应该是什么样子才能正确显示吗 holder artistImage setImageResource model getArt
  • 如何从 Retrofit2 获取字符串响应?

    我正在做 android 正在寻找一种方法来执行超级基本的 http GET POST 请求 我不断收到错误 java lang IllegalArgumentException Unable to create converter for
  • Renderscript 示例构建错误

    所以我想尝试使用 RenderScript 的示例 并在 Eclipse 中导入了 HelloWorld 但它给了我这样的错误 2011 10 25 13 10 48 HelloWorld home mileoresko workspace
  • 以编程方式更新 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
  • Firebase ANR - 甚至不使用 firebase

    随着 GMS 的最新更新 引入了新的 ANR 如果您退出应用程序 然后返回 则 ANR 就会初始化 线程跟踪似乎指向 Firebase 但我什至从未开始使用 Firebase 我猜它一定是新的 GMS 包的一部分 06 11 00 34 0
  • 以编程方式将 TextView 添加到主屏幕小部件

    我想以编程方式将文本视图控件添加到我的主屏幕小部件 在下面的示例中 我使用 TextView 填充 Linearlayout 但是这里应该如何使用 RemoteView 它只接受 xml 资源布局作为参数 public class MyWi
  • 如何在进入新活动之前终止线程和处理程序

    大家好 在我尝试清理处理程序时 这段代码可能有点混乱 因为我一直在尝试追踪崩溃发生的位置 我有一个对话框活动 显示密码输入 进度条由线程和处理程序动画显示 似乎当我试图查看进度条是否完成并尝试终止线程时 当我尝试进入新活动时 我这样做的方式
  • 如何在 Android NDK 中创建新的 NativeWindow 而无需 Android 操作系统源代码?

    我想编译一个 Android OpenGL 控制台应用程序 您可以直接从控制台启动 Android x86 运行 或者从 Android x86 GUI 内的 Android 终端应用程序运行 这个帖子 如何在 Android NDK 中创
  • 在Android Studio中更改项目主题?

    我使用浅色主题创建了一些项目 现在我想将其更改为深色 但我不知道该怎么做 顺便说一句 我不是问如何在代码中做到这一点 只是问如何更改项目的默认主题 在 AndroidManifest xml 的 application 标签下 您可以设置您
  • FCM onMessageReceived 应用程序运行时返回空白消息和标题

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

    我不确定我是否使用了正确的词语来描述此 UI 功能 但我已附上我希望在我的应用程序中实现的目标的快照 它由 Go SMS 使用 用户在编辑文本中键入联系人 在用户从完成下拉列表中选择联系人后 该联系人将被插入到编辑文本中 如附图所示 编辑文

随机推荐

  • 从 C# 代码将数据插入 SQL Server

    我有一张桌子student id name 然后我有一个文本框 用于输入名称 当单击提交按钮时 它将数据插入数据库 那么我怎样才能只插入名称 而不插入id 因为id是自动递增的呢 我试过这个 insert into student id n
  • Maven 和 Eclipse 使用的 Checkstyle 配置

    我尝试在 Maven 和 Eclipse 中使用相同的 Checkstyle 配置文件 模块 SuppressionCommentFilter 在 Eclipse 中按预期工作 但 Maven 报告 不允许 TreeWalker 作为 Su
  • 具有相同内容的两个字符串何时(不)共享相同的内存?

    来自问题两个内容相同的字符串会存储在同一个内存位置吗 拥有Java代码 String s1 Java 该字符串是否会分配在同一内存位置 或多个 是否多次启动同一个程序并并行 同时 执行它 可能的答案 我目前是 C 开发人员 尽管在上个世纪是
  • 将值数组发送到 Oracle 过程以在 WHERE IN 子句中使用

    我在Oracle中有一个存储过程 如下所示 CREATE PROCEDURE MY TEST PROC CUR OUT SYS REFCURSOR PARAM THAT WILL BE USED INSIDE WHERE IN AS BEG
  • 用Java读取svg路径数据的最简单方法? [复制]

    这个问题在这里已经有答案了 我希望使用 svg 图像并解析 处理不同的路径来进行自定义转换 在Java中 简单提取路径数据的最简单方法是什么 我正在查看 apache xmlgraphics batik 包 但如何返回路径类型和参数并不明显
  • ActiveMQ:通过JMX获取连接列表?

    如何获取ActiveMQ OpenWire 连接器的连接列表 JConsole 能够列出连接 但我看不到可以使用哪个 视图 来获取列表 连接的对象名称示例 org apache activemq BrokerName localhost T
  • 在 JavaFX 2 中播放带字幕的视频

    我注意到 JavaFX 1 有一个SubtitleTrack用于从视频文件中提取字幕的类 但我在 JavaFX 2 中找不到等效的功能 javafx scene media似乎不存在 这个功能是否已经实现了 在什么情况下它转移到了哪里 或者
  • Appium 和 Selenium 网格的并行测试

    我正在尝试使用 appium 和 selenium 网格在 2 个设备上运行并行测试 但由于某种原因 它仅在第一个节点服务器 和第一个设备 上运行 但在第二个服务器上没有任何反应 另外 如果我关闭第一台服务器并运行测试 那么测试将在第二台服
  • Boost asio 处理程序不会保持 io_service 运行

    我想向 boost io service 添加一个信号处理程序 允许应用程序在用户按下 Ctrl C 时彻底关闭 这当然可以通过停止循环轻松完成 如下所示 boost asio io service service boost asio s
  • FB.ui 弹出窗口未关闭

    初始化代码 FB init appId 123456789012345 channelUrl http localhost Some Url FacebookChannel status true cookie true oauth tru
  • 如何将接收字节图像的对象转换为实际图像?

    我正在用 C 开发智能设备应用程序 我正在调用网络服务 Web 服务方法返回谷歌地图 该方法的返回类型是对象 该对象包含字节格式的图像 该对象包含 base64binary 格式的图像 我需要在我的应用程序中显示实际图像 我需要进行什么类型
  • jpa2/eclipselink 合适的 DAO 结构是什么?

    我有 JPA 实体并且需要用它们执行逻辑 到目前为止 一个巨大的静态数据库类完成了这项工作 它很丑陋 因为每个公共接口方法都有一个使用 EntityManager 的私有等效方法来执行事务 但我也可以通过静态 em 来解决这个问题 然而我想
  • gfortran 需要格式宽度而 ifort 不需要?

    我正在尝试将 FOR 文件 出于练习目的 从 ifort 迁移到 gfortran 该文件在我的 Intel Visual Fortran 解决方案中编译时没有任何问题 但是 当我使用以下命令在 gfortran 中编译它时 gfortra
  • 为什么 ObservedObject 数组未在我的 SwiftUI 应用程序中更新?

    我正在玩 SwiftUI 试图了解如何ObservableObject作品 我有一个数组Person对象 当我添加一个新的Person到数组中 它会重新加载到我的视图中 但是如果我更改现有的值Person 它不会重新加载到视图中 Names
  • 如何获取 std::locale 的日期和时间的当前“本地化模式”

    到目前为止 我能够获取当前的区域设置 但我想获取该特定区域设置的日期格式 这可以用标准库来完成吗 include
  • 使用 EF Core IdentityContext 和 DbContext 进行订单管理

    我正在 ASP MVC Core 2 上创建一个电子商务网站 我继承了我的用户IdentityUser并继承了上下文IdentityDbContext用于处理用户数据并继承了不同的上下文DbContext用于处理产品和订单等 现在 我想将订
  • 在 Ruby 安装期间遇到 RVM 问题 (1.9.2)

    我正在尝试通过 RVM 安装 ruby 但收到以下错误 并且日志不太清楚发生了什么 有人遇到过这种情况吗 我似乎记得 Ruby 不应该以 root 身份安装 但我对收到的权限错误有点怀疑 Installing Ruby from sourc
  • 如何使用 PHP 中的curl 上传文件

    如何在 PHP 中使用 cURL 或其他方式上传文件 换句话说 用户在表单上看到文件上传按钮 表单被发布到我的 PHO 脚本 然后我的 PHP 脚本需要将其重新发布到另一个脚本 例如在另一台服务器上 我有这个代码来接收文件并上传它 echo
  • 10 秒内完成 Postgresql 查询

    有没有办法创建一个将运行十秒的查询 我不需要真实的数据 只是一种长时间运行查询的方法 这样我就可以测试系统在这段时间内的工作情况 我不想创建一个巨大的表并为此进行简单的选择 有什么技巧吗 pg sleep SELECT pg sleep 1
  • 使用 C++ 和 NativeActivity 类获取 Android APK 的名称

    我正在使用 NDK 和 NativeActivity 编写 Android 应用程序 我的应用程序依赖于一些作为资产提供的第三方代码 目前 我正在尝试提取这些资产 同时保持文件夹结构完整 我尝试过使用 AssetManager 但为了保持文