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

使用C和NativeActivity类获取Android APK的名称,第1张

概述我正在使用NDK和NativeActivity编写 Android应用程序.我的应用程序依赖于作为资产提供的一些第三方代码.目前我正在尝试提取这些资产,同时保持文件夹结构不变. 我已经尝试过使用AssetManager,但为了保持文件夹结构的完整性,似乎会涉及大量的代码,对于一个简单的任务,比如我所提到的.我已经转而专注于尝试将APK视为ZIP文件并以这种方式提取其内容.但这要求我找到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成员有一个丑陋的警告,如果我理解正确,这段代码将在本机活动的线程中运行.
> ANativeActivity的clazz成员似乎被错误命名,实际上是Java NativeActivity的实例而不是类对象.否则此代码将无效.我真的很讨厌依赖于这样明显错误名称的东西.

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

总结

以上是内存溢出为你收集整理的使用C和NativeActivity类获取Android APK的名称全部内容,希望文章能够帮你解决使用C和NativeActivity类获取Android APK的名称所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1220652.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-05
下一篇2022-06-05

发表评论

登录后才能评论

评论列表(0条)

    保存