加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:30:11 所属栏目:百科 来源:网络整理
导读:我正在使用NDK和NativeActivity编写 Android应用程序.我的应用程序依赖于作为资产提供的一些第三方代码.目前我正在尝试提取这些资产,同时保持文件夹结构不变. 我已经尝试过使用AssetManager,但为了保持文件夹结构的完整性,似乎会涉及大量的代码,对于一个简单
我正在使用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成员有一个丑陋的警告,如果我理解正确,这段代码将在本机活动的线程中运行.
> ANativeActivity的clazz成员似乎被错误命名,实际上是Java NativeActivity的实例而不是类对象.否则此代码将无效.我真的很讨厌依赖于这样明显错误名称的东西.

除此之外,它有效,我实际上是要自己使用它来尝试使用libzip从数据目录中提取资源.apk.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读