gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:38:26 25 4
gpt4 key购买 nike

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

我尝试过使用 AssetManager,但要保持文件夹结构完整,似乎需要大量代码才能完成我提到的简单任务。从那以后,我将重点转移到尝试实现将 APK 视为 ZIP 文件并以这种方式提取其内容。但这需要我找到 APK 的确切路径。

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

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

编辑:这可能吗?

最佳答案

我实际上能够通过 JNI 调用 getPackageCodePath 并让它工作。 NDK r7 中 native Activity 示例中 android_main 顶部的以下代码记录了正确的路径并且不会崩溃:

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. 线程安全 - 有一个关于在主 Java 线程中仅使用 ANativeActivityenv 成员的丑陋警告,如果我理解正确,这段代码将会在 native Activity 的线程中运行。
  2. ANativeActivityclazz 成员似乎被错误命名,实际上是 Java NativeActivity 的实例而不是类对象。否则这段代码将无法工作。我真的很讨厌依赖这样一个明显被错误命名的东西。

除此之外,它还有效,我实际上正打算自己使用它来尝试使用 libzip 将 Assets 从 .apk 中提取出来,并将其提取到数据目录中。

关于android - 使用 C++ 和 NativeActivity 类获取 Android APK 的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7701801/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com