rst*_*at1 3 android android-ndk native-activity
我正在使用NDK和NativeActivity编写Android应用程序.我的应用程序依赖于作为资产提供的一些第三方代码.目前我正在尝试提取这些资产,同时保持文件夹结构不变.
我已经尝试过使用AssetManager,但为了保持文件夹结构的完整性,似乎会涉及大量的代码,对于一个简单的任务,比如我所提到的.我已经转而专注于尝试将APK视为ZIP文件并以这种方式提取其内容.但这要求我找到APK的确切路径.
在普通的Android应用程序中,可以使用getPackageCodePath,但这是一个附加到Context类的抽象方法.我的问题是如何在不使用普通活动时获取APK的确切路径?
此外,我尝试通过JNI调用getPackageCodePath,但由于无法找到该方法而导致应用程序崩溃.
编辑:这甚至可能吗?
我实际上能够getPackageCodePath通过JNI 打电话让它工作.以下代码放在android_mainNDK r7中的native-activity示例的顶部,记录正确的路径并且不会崩溃:
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);
...
}
Run Code Online (Sandbox Code Playgroud)
不过,我觉得这可能不是一个很好的解决方案.有两件事让我担心:
env成员ANativeActivity,如果我理解正确,这段代码将在本机活动的线程中运行.ANativeActivity的clazz成员似乎是错误名称,实际上是Java的实例NativeActivity而不是类对象.否则此代码将无效.我真的很讨厌依赖于这样明显错误名称的东西.除此之外,它可以工作,而我实际上是要自己使用它来尝试使用libzip从数据目录中提取资源.apk.
| 归档时间: |
|
| 查看次数: |
7365 次 |
| 最近记录: |