我正在使用 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);
...
}
不过,我觉得这可能不是一个很好的解决方案。有两件事让我担心:
- 线程安全 - 有一个关于仅使用
env
成员ANativeActivity
在主 Java 线程中,如果我理解正确的话,这段代码将在本机活动的线程中运行。
-
ANativeActivity
's clazz
成员似乎命名错误,实际上是 Java 的实例NativeActivity
而不是类对象。否则这段代码将无法工作。我真的很讨厌依赖像这样明显命名错误的东西。
除此之外,它确实有效,而且我实际上自己也打算使用它来尝试使用 libzip 将资产从 .apk 中提取出来并放入数据目录中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)