使用C和NativeActivity类获取Android APK的名称
我正在使用NDK和NativeActivity编写
Android应用程序.我的应用程序依赖于作为资产提供的一些第三方代码.目前我正在尝试提取这些资产,同时保持文件夹结构不变.
我已经尝试过使用AssetManager,但为了保持文件夹结构的完整性,似乎会涉及大量的代码,对于一个简单的任务,比如我所提到的.我已经转而专注于尝试将APK视为ZIP文件并以这种方式提取其内容.但这要求我找到APK的确切路径. 在普通的Android应用程序中,可以使用getPackageCodePath,但这是一个附加到Context类的抽象方法.我的问题是如何在不使用普通活动时获取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); ... } 不过,我觉得这可能不是一个很好的解决方案.有两件事让我担心: >线程安全 – 关于在主Java线程中仅使用ANativeActivity的env成员有一个丑陋的警告,如果我理解正确,这段代码将在本机活动的线程中运行. 除此之外,它有效,我实际上是要自己使用它来尝试使用libzip从数据目录中提取资源.apk. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |