【问题标题】:Error when trying to access nativeLibraryDir尝试访问 nativeLibraryDir 时出错
【发布时间】:2021-10-22 11:08:20
【问题描述】:

我正在尝试访问 jni 中的 getPackageManager.getApplicationInfo。

const char* getNativeLibPath(JNIEnv* env, jobject thiz, const char* libraryName, const char* packageName) {
    jclass contextClass = env->GetObjectClass(thiz);
    jmethodID getPackageManager = env->GetMethodID(contextClass, "getPackageManager", "()Landroid/content/pm/PackageManager;");
    jobject instantiatePackageManager = env->CallObjectMethod(thiz, getPackageManager);
    jclass packageManagerClass = env->GetObjectClass(instantiatePackageManager);
    jmethodID getApplicationInfo = env->GetMethodID(packageManagerClass, "getApplicationInfo", "(Ljava/lang/String;I)Landroid/content/pm/ApplicationInfo;");
    jobject instantiateApplicationInfo = env->CallObjectMethod(thiz, getApplicationInfo, packageName, 0);
    jclass applicationInfoClass = env->GetObjectClass(instantiateApplicationInfo);
    jfieldID nativeLibraryDir = env->GetFieldID(applicationInfoClass, "nativeLibraryDir", "Ljava/lang/String;");
    auto string = (jstring) env->GetObjectField(instantiateApplicationInfo, nativeLibraryDir);
    const char* returnValue = env->GetStringUTFChars(string, nullptr);
    std::string appendedResult = std::string(returnValue) + std::string("/") + std::string(libraryName);
    return appendedResult.c_str();
}

这是我的代码。但是由于某种原因,我收到了这个错误:JNI ERROR (app bug): accessed stale WeakGlobal 0x74eecd21ff (index 1324143135 in a table of size 38) JNI DETECTED ERROR IN APPLICATION: use of deleted weak global reference 0x74eecd21ff 任何帮助表示赞赏!

【问题讨论】:

    标签: android c++ java-native-interface


    【解决方案1】:

    您的代码至少存在三个问题:

    1. 您使用 const char * 调用 getApplicationInfo,它需要一个 Java 字符串:
    jobject instantiateApplicationInfo = env->CallObjectMethod(instantiatePackageManager, getApplicationInfo, env->NewStringUTF(packageName), 0);
    
    1. Java端需要调用env->ReleaseStringUTF(returnValue)释放字符串

    2. 你不能像这样返回const char *。要么直接返回std::string,要么用new char[]分配内存,让调用者释放它。

    【讨论】:

    • 感谢您的回复!出于某种原因,我在使用您的答案时收到此错误:jobject instantiateApplicationInfo = env->CallObjectMethod(thiz, getApplicationInfo, env->NewStringUTF(packageName), 0); 我收到的错误是:JNI DETECTED ERROR IN APPLICATION: can't call android.content.pm.ApplicationInfo android.app.ApplicationPackageManager.getApplicationInfo(java.lang.String, int) on instance of com.arc.dlopenhook.MainActivity
    • 也感谢其他建议!
    • 我刚刚从您的代码中复制了该行并添加了NewStringUTF。事后看来,thiz 可能应该是包管理器。见编辑。
    • 是的,解决了它。非常感谢!
    猜你喜欢
    • 2012-07-06
    • 1970-01-01
    • 2022-08-07
    • 2012-03-18
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多