我实际上可以getPackageCodePath
通过 JNI 调用并让它工作。以下代码放在android_main
NDK r7 中本机活动示例的顶部,记录了正确的路径并且不会崩溃:
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);
...
}
不过,我觉得这可能不是一个很好的解决方案。有两件事让我担心:
env
线程安全 - 有一个关于仅在主 Java 线程中使用成员的丑陋警告ANativeActivity
,如果我理解正确,这段代码将在本机活动的线程中运行。
ANativeActivity
的clazz
成员似乎命名错误,实际上是 Java 的实例NativeActivity
而不是类对象。否则此代码将不起作用。我真的很讨厌依赖像这样明显错误命名的东西。
除此之外,它还可以工作,我实际上将自己使用它来尝试使用 libzip 将资产从 .apk 中提取出来并放入数据目录中。