C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了使用C和NativeActivity类获取Android APK的名称大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_301_1@
我正在使用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的名称所遇到的程序开发问题。

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: